#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);
}
}


