#include class DashboardWidget : public QWidget { public: DashboardWidget(QWidget *parent = nullptr) : QWidget(parent) { currentValue = 0; 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: int currentValue; QString Title; QString showText; };