Files
2024-08-14 11:15:16 +08:00

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