QPaint绘制自定义仪表盘组件02

该代码展示了如何使用Qt框架创建一个带有动态数值显示和渐变效果的自定义widget,通过QTimer实现定时更新,展示了UI编程中的基础绘图和事件处理。
摘要由CSDN通过智能技术生成

网上视频抄的,用来自己看一下,看完就删掉

最终效果

ui,创建一个空的widget

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
    void paintEvent(QPaintEvent *event) override;

private:
    Ui::Widget *ui;
    int maxValue = 50;
    int minValue = 0;
    int curValue = 20;

    QTimer *timer;
};
#endif // WIDGET_H

widget.cpp 

#include "widget.h"
#include "ui_widget.h"
#include <QPolygon>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [=]() {
        curValue += 1;
        if (curValue > maxValue) {
            curValue = minValue;
        }
        update();
    });
    timer->start(100);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    (void)event;
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 将painter移动到中心位置
    painter.translate(rect().center());

    // 画一个带有渐变色的圆圈
    // 镜像渐变
    QRadialGradient ra(0, 0, qMin(width(), height() / 2));
    // 设置起点颜色
    ra.setColorAt(0, Qt::green);
    // 终点颜色
    ra.setColorAt(1, Qt::cyan);
    painter.setBrush(ra);
    painter.setPen(Qt::NoPen);
    painter.drawEllipse(QPoint(0, 0), qMin(width(), height()) / 2, qMin(width(), height()) / 2);

    qreal angle = 270 * 1.0 / (maxValue - minValue);
    // 135°为刻度的起始点对应的角度
    painter.rotate(135);
    // 绘制刻度线
    painter.setPen(QPen(Qt::white, 4));
    painter.setFont(QFont("微软雅黑", 18));
    for (int i = minValue; i <= maxValue; ++i) {
        if (i % 10 == 0) {
            if (135 + angle * i < 270) {
                painter.rotate(180);
                painter.drawText(-qMin(width(), height()) / 2 + 30, 10, QString::number(i));
                painter.rotate(-180);
            } else {
                painter.drawText(qMin(width(), height()) / 2 - 20 - 50, 10, QString::number(i));
            }
            // 第一个参数是起始点的 x 坐标,第二个参数是起始点的 y 坐标,第三个参数是终止点的 x 坐标,第四个参数是终止点的 y 坐标。
            painter.drawLine(qMin(width(), height()) / 2 - 20, 0, qMin(width(), height()) / 2, 0);
        } else {
            painter.drawLine(qMin(width(), height()) / 2 - 10, 0, qMin(width(), height()) / 2, 0);
        }
        painter.rotate(angle);
    }
    // 刻度画完后,将painter旋转至水平向下的角度,以便在中心位置绘制文字
    // 之前时顺时针旋转的,现在逆时针旋转45°就可以了
    painter.rotate( - angle - 45);
    // 绘制一个圆圈
    // `painter.drawEllipse()` 函数的第二个和第三个参数分别表示椭圆的半长轴长度和半短轴长度。
    painter.drawEllipse(QPoint(0, 0), 100, 100);
    // 绘制文字
    // QRect(-100, -100, 200, 200)是一个矩形,其四个数字分别表示矩形的左上角坐标 `(x, y)` 和矩形的宽度和高度 `(w, h)`。
    // 以坐标原点为中心的 200x200 的矩形内绘制一个字符串
    // 矩形的左上角的坐标是 `(-100, -100)`,也就是在坐标原点的左上角位置偏移了 100 个像素的位置。
    // 这里的 `-100` 表示的是相对于坐标空间原点的坐标偏移量,而不是屏幕上的实际像素值。
    // 这个矩形的宽度和高度均为 `200`,因此其右下角的坐标为 `(100, 100)`。
    // 参数 `Qt::AlignCenter` 表示绘制文本时文字水平和竖直方向的对齐方式。
    // 这里使用了 `Qt::AlignCenter` 表示文本应该水平居中和竖直居中对齐。
    painter.drawText(QRect(-100, -100, 200, 200), Qt::AlignCenter, QString::number(curValue));

    // painter的x轴回到刻度起始位置
    painter.rotate(135 + curValue * angle);
    // `width()` 和 `height()` 函数返回的分别是 `QWidget` 控件的宽度和高度。
    painter.drawLine(100, 0, qMin(width(), height()) / 2 - 20 - 50, 0);

    // 绘制扇形渐变色
    painter.rotate(-135 - curValue * angle);
    painter.setBrush(QColor(255, 0, 0, 100));
    painter.setPen(Qt::NoPen);
    painter.drawPie(QRect(-qMin(width(), height()) / 2 + 20 + 50,
                            -qMin(width(), height()) / 2 + 20 + 50,
                            qMin(width(), height()) - 40 - 100,
                            qMin(width(), height()) - 40 - 100),
                            (360 - 135) * 16,
                            -curValue * angle * 16);
}

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值