Qt 绘制仪表盘

1. 首先准备素材,一个表盘,一个指针
这里写图片描述
这里写图片描述



2. 计算旋转圆心及转动角度
通过画图软件测量一下表盘中心的坐标,及指针中心的坐标
这里写图片描述
大概表盘的中心为(163,163),同样指针的中心位置为(14,110)
转动角度可以大概测量一下,应该为(-120,120)度



3. 转动操作
有了这些数据就可以来绘制表盘了

//设置表盘的中心
#define CenterPoint_X  163
#define CenterPoint_Y  163

//设置指针的中心,注意这里是负的,因为一会我们要平移坐标系
#define NeedleCenter_X     -14   //
#define NeedleCenter_Y     -110

//指针图片的宽度和高度
#define NeedlePic_W         28
#define NeedlePic_H         123

//指针可以活动的最小最大值
#define Needle_MinAngle    -120
#define Needle_MaxAngle     120

//每一次Qt刷新,指针改变的的度数
#define Needle_Step         1

//初始化
SPDWidget::SPDWidget(QWidget *parent) :
    QWidget(parent)
{
    this->resize(320, 320);
    pix_Needle.load("./res/style_1/needle.png");

    d_Pointer_angle_now = Needle_MinAngle;   //start angle
}

//画图
void SPDWidget::paintEvent(QPaintEvent  *event)
{
    //每次调用这个函数,改变角度值
    set_angle();

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setRenderHint(QPainter::SmoothPixmapTransform);

    //-----------------------------------------
    painter.save();
    //设置新的圆心,其实也是旋转中心
    painter.translate(CenterPoint_X, CenterPoint_Y);   
    //旋转一个角度
    painter.rotate(d_Pointer_angle_now);
    //画指针,注意是在指针中心的反方向开始画
    painter.drawPixmap(NeedleCenter_X, NeedleCenter_Y,
                       NeedlePic_W, NeedlePic_H,
                       pix_Needle);
    //使原点复原
    painter.restore();
}

//测试函数,在最小与最大范围之间摆动
void SPDWidget::set_angle()
{
    static int iDirection = 1;
    if (d_Pointer_angle_now >= Needle_MaxAngle)
    {
        iDirection = -1;
    }
    else if (d_Pointer_angle_now <= Needle_MinAngle)
    {
        iDirection = 1;
    }

    //每次改变的角度值
    d_Pointer_angle_now = d_Pointer_angle_now + iDirection * Needle_Step;

}
  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在Qt的MainWindow上绘制温度仪表盘,可以使用Qt的绘图类QPainter和QPaintEvent事件。以下是实现的基本步骤: 1. 在MainWindow的头文件中声明一个函数,用于绘制温度仪表盘。 ```cpp protected: void paintEvent(QPaintEvent *event); ``` 2. 在cpp文件中实现这个函数,使用QPainter绘制温度仪表盘。 ```cpp void MainWindow::paintEvent(QPaintEvent *event) { // 创建QPainter对象 QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 设置抗锯齿 // 定义变量 int side = qMin(width(), height()); // 获取窗口的最小边长 int x = (width() - side) / 2; int y = (height() - side) / 2; int radius = side / 2; // 绘制圆盘 painter.translate(x, y); // 将坐标系移动到中心点 painter.setPen(Qt::NoPen); painter.setBrush(Qt::white); painter.drawEllipse(QPointF(0, 0), radius, radius); // 绘制刻度 painter.setPen(QPen(Qt::black, 2)); // 设置画笔 painter.save(); // 保存坐标系状态 for(int i = 0; i <= 360; i += 10) { painter.rotate(10); // 旋转坐标系 if(i % 30 == 0) { painter.drawLine(0, radius - 20, 0, radius - 40); // 绘制长刻度线 painter.drawText(-10, radius - 60, QString::number(i / 30)); // 绘制刻度值 } else { painter.drawLine(0, radius - 20, 0, radius - 30); // 绘制短刻度线 } } painter.restore(); // 恢复坐标系状态 // 绘制指针 painter.save(); // 保存坐标系状态 painter.rotate(225); // 旋转坐标系 painter.setPen(QPen(Qt::red, 5)); // 设置画笔 painter.drawLine(0, 0, radius - 40, 0); // 绘制指针 painter.restore(); // 恢复坐标系状态 } ``` 3. 在MainWindow的构造函数中启用Qt的自动填充背景色功能。 ```cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setAttribute(Qt::WA_StyledBackground, true); } ``` 现在,当MainWindow被绘制时,温度仪表盘将自动绘制在窗口中央。可以通过更改指针的旋转角度来模拟不同的温度值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值