98 lines
3.3 KiB
C++
98 lines
3.3 KiB
C++
#include <QtWidgets>
|
|
|
|
class DashboardWidget : public QWidget {
|
|
public:
|
|
DashboardWidget(QWidget *parent = nullptr) : QWidget(parent) {
|
|
currentValue = 0;//NG占比
|
|
showText = "100%";
|
|
setMinimumSize(80, 80);
|
|
setMaximumSize(100, 100);
|
|
}
|
|
|
|
void setCurrentPercentage(int value) {
|
|
if (value*3.6 != currentValue) {
|
|
currentValue = value*3.6;
|
|
showText = QString::number(100-value) + "%";
|
|
update();
|
|
}
|
|
}
|
|
//void setCurrentValue(int value) {
|
|
// if (value != currentValue) {
|
|
// currentValue = value;
|
|
// showText = QString::number((360-value)/360)+ "%";
|
|
// update();
|
|
// }
|
|
//}
|
|
|
|
protected:
|
|
void paintEvent(QPaintEvent* event) override {
|
|
int startAngle = 90;
|
|
int endAngle = currentValue+ startAngle-1;
|
|
|
|
QPainter painter(this);
|
|
painter.setRenderHint(QPainter::Antialiasing);
|
|
painter.setRenderHint(QPainter::TextAntialiasing);
|
|
|
|
int side = qMin(width(), height());
|
|
|
|
// 绘制外框
|
|
painter.setPen(QPen(QColor(255, 255, 255), 2));
|
|
painter.setBrush(Qt::NoBrush);
|
|
painter.drawEllipse(width() / 2 - side / 2 + 1, height() / 2 - side / 2 + 1, side - 2, side - 2);
|
|
|
|
// 绘制指针
|
|
painter.save();
|
|
painter.translate(width() / 2, height() / 2);
|
|
painter.rotate(currentValue); // 假设每个刻度代表10个单位,360度/10 = 36度
|
|
|
|
|
|
// 绘制顺时针渐变绿色区域
|
|
QRadialGradient greenGradient(QPointF(0, 0), side / 2);
|
|
greenGradient.setColorAt(0.70, Qt::transparent);
|
|
greenGradient.setColorAt(0.96, QColor(76, 255, 76));
|
|
greenGradient.setColorAt(1, QColor(76 ,255,76));
|
|
painter.setPen(QPen(Qt::transparent, 20));
|
|
painter.setBrush(greenGradient);
|
|
painter.drawEllipse(QPointF(0, 0), side / 2-2, side / 2-2);
|
|
|
|
// 绘制逆时针渐变红色区域
|
|
if (currentValue > 0) {
|
|
QRadialGradient redGradient(QPointF(0, 0), side / 2);
|
|
redGradient.setColorAt(0.80, Qt::transparent);
|
|
redGradient.setColorAt(0.80, QColor(255, 76, 76));
|
|
redGradient.setColorAt(1, QColor(255, 76, 76));
|
|
painter.setPen(QPen(Qt::transparent, 20));
|
|
painter.setBrush(redGradient);
|
|
painter.drawPie(QRectF(-side / 2+2, -side / 2+2, side -4, side-4), startAngle * 16, (endAngle - startAngle) * 16);
|
|
}
|
|
|
|
// 使用渐变来绘制指针
|
|
QLinearGradient gradient(QPointF(-2, -side / 2), QPointF(2, -side / 2 ));
|
|
gradient.setColorAt(0, Qt::transparent);
|
|
gradient.setColorAt(0.8, Qt::white);
|
|
gradient.setColorAt(1, Qt::white);
|
|
painter.setPen(QPen(Qt::transparent, 3));
|
|
painter.setBrush(gradient);
|
|
painter.drawConvexPolygon(QPolygonF() << QPointF(-2, -side / 2) << QPointF(2, -side / 2) << QPointF(0, -side / 2 + 40));
|
|
|
|
painter.restore();
|
|
|
|
// 显示当前值
|
|
QFont font("Impact", 24, QFont::Bold);
|
|
font.setStretch(130);
|
|
|
|
painter.setPen(Qt::white);
|
|
painter.setFont(font);
|
|
|
|
painter.drawText(QRect(2,-2, side, side), Qt::AlignCenter, showText);
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
double currentValue;
|
|
QString Title;
|
|
QString showText;
|
|
};
|
|
|
|
#pragma once |