CPU使用率控件

#ifndef DASHBOARD_H
#define DASHBOARD_H

#include 

class dashboard : public QWidget
{
    Q_OBJECT
public:
    explicit dashboard(QWidget *parent = nullptr);
protected:
    void paintEvent(QPaintEvent *event) override;
    void keyPressEvent(QKeyEvent *event) override;
    void keyReleaseEvent(QKeyEvent *event) override;
    void get_color(int value);
signals:

private:
    int value;
    int angle;
    bool direction;
    QTimer *timer;
    QColor bg_c,rect1_c,rect2_c;//rect1:大矩形

};

#endif // DASHBOARD_H
#include "dashboard.h"
#include 
#include 
#include 
#include 
#pragma execution_character_set("utf-8")
dashboard::dashboard(QWidget *parent) : QWidget(parent)
{
    resize(200,100);
    direction=0;
    timer=new QTimer(this);
    value=70;
    direction=1;
    connect(timer,&QTimer::timeout,this,[=](){
        //qDebug()<stop();
            }
        }
        update();//刷新画面。很重要!
    });
}

void dashboard::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing, true);


    get_color(value);
    //value:0---100
    //angle:0---180
    angle=1.8*value;

    double x_center,y_center;
    x_center=width()/2;
    y_center=height()*0.9;
    double radius;
    radius=fmin(width()/2,height())*0.9;

    double r2=radius*0.75;
    double r1=0.03*r2;
    //画背景
    painter.save();
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(255,255,255)));
    painter.drawRect(rect());
    painter.restore();

    //画蓝色半圆
    painter.save();
    painter.translate(x_center,y_center+r1*1.5);

    painter.setBrush(QBrush(QColor(bg_c)));
    painter.setPen(Qt::NoPen);
    painter.drawPie(-r2,-r2,2*r2,2*r2,0,180*16);
    painter.restore();

    //画蓝色半圆上的小矩形
    painter.save();
    painter.translate(x_center,y_center);
    double w1,h1;
    w1=0.6*r1;
    h1=2*r1;
    QRect rect1(-w1,-h1-0.8*r2,2*w1,2*h1);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(rect2_c)));
    //180=20*9
    for(int i=0,a=0;i<=20;i++,a+=9)
    {
        painter.save();
        painter.rotate(a-90);
        painter.drawRect(rect1);
        painter.restore();
    }
    painter.restore();

    //画蓝色半圆外的小方块
    painter.save();
    painter.translate(x_center,y_center);
    double w2,h2;
    w2=0.75*r1;
    h2=3*r1;
    QRect rect2(-w2,-h2-1.2*r2,2*w2,2*h2);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(rect2_c)));
    //180=45*4
    for(int i=0,a=0;i<=45;i++,a+=4)
    {
        painter.save();
        painter.rotate(a-90);
        painter.drawRect(rect2);
        painter.restore();
    }
    painter.restore();

    //画蓝色半圆外的大方块
    painter.save();
    painter.translate(x_center,y_center);
    double w3,h3;
    w3=r1;
    h3=4*r1;
    QRect rect3(-w3,-h3-1.2*r2,2*w3,2*h3);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(rect1_c)));
    //180=45*4
    for(int i=0,a=0;i<=angle/4;i++,a+=4)
    {
        painter.save();
        painter.rotate(a-90);
        painter.drawRect(rect3);
        painter.restore();
    }
    painter.restore();

    //画指针
    painter.save();
    painter.translate(x_center,y_center);
    painter.rotate(angle-90);
    //rotate=0,对应90
    //rotate=30,对应90+30=120
    //rotate=80,对应90+80=170
    //rotate=-80,对应90-80=10
    double r3=1.5*r1;
    double w=2*r3,h=12*r3;
    QPoint p1,p2,p3;
    p1=QPoint(-r3,0);
    p2=QPoint(r3,0);
    p3=QPoint(0,-h);
    QPoint points[3]={
        p1,p2,p3
    };
    painter.setBrush(QBrush(QColor(rect1_c)));
    painter.setPen(Qt::NoPen);
    painter.drawPolygon(points,3);
    //画蓝色圆
    painter.drawEllipse(-r3,-r3,2*r3,2*r3);
    painter.restore();

    //画白色圆心
    painter.save();
    painter.translate(x_center,y_center);

    painter.setBrush(QBrush(QColor(255,255,255)));
    painter.setPen(Qt::NoPen);
    painter.drawEllipse(-r1,-r1,2*r1,2*r1);
    painter.restore();

}

void dashboard::keyPressEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_Space){
        qDebug()<<"空格按下";
        if(direction==0){
            direction=1;
            if(!timer->isActive())timer->start(10);//该句可能重复调用,在没有stop时。
        }
    }
}

void dashboard::keyReleaseEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_Space){
        qDebug()<<"空格抬起";
        direction=0;
    }

}

void dashboard::get_color(int value)
{
    if(value<=60){
        bg_c=QColor(243, 248, 255);
        rect1_c=QColor(142, 189, 255);
        rect2_c=QColor(196, 221, 251);
    }
    else if(value>60 && value<=80){
        bg_c=QColor(255, 249, 245);
        rect1_c=QColor(255, 161, 100);
        rect2_c=QColor(255, 246, 235);
    }
    else{
        bg_c=QColor(255, 248, 243);
        rect1_c=QColor(255, 92, 92);
        rect2_c=QColor(253, 223, 222);
    }
}

CPU使用率控件_第1张图片CPU使用率控件_第2张图片CPU使用率控件_第3张图片

你可能感兴趣的:(qt)