qt5实现表盘的旋转效果,通过提升QLabel类

news/2025/2/22 17:49:14

因为工作需要,需要实现温度的表盘展示效果

实现思路:

   通过提示声QLabel控价类,实现报盘的旋转和展示效果

1. 编写一个QLabel的类MyQLabel,实现两个方法

   1.  void paintEvent(QPaintEvent *event); //重绘函数

   2.  void valueChanged(int value); //更改值

2.提升QLabel控件,实现两个方法函数的重置入

3. 通过按钮和滑动条,改变数值,实现指针的转动调整指针的指向

实现表盘转动的功能。

myqlabel.h

#ifndef MYQLABEL_H

#define MYQLABEL_H

#include <QObject>

#include <QLabel>

#include <QPainter>

class MyQLabel : public QLabel

{

Q_OBJECT

public:

QPixmap needle; //指针

QPixmap overlay; //中间显示盘

QPixmap img; //显示转盘

int nvalue;

explicit MyQLabel(QWidget *parent=0);

void paintEvent(QPaintEvent *event); //重绘函数

void valueChanged(int value); //更改值

//void DrawRangle(int x ,int y ,int h,int w); //绘制矩形

};

#endif // MYQLABEL_H

2. myqlabel.c文件内容
#include "myqlabel.h"
#include <QDebug>
MyQLabel::MyQLabel(QWidget *parent): QLabel(parent)
{
    needle = QPixmap(":/image/ned.png");
    overlay= QPixmap(":/image/lay.png");
    img = QPixmap(":/image/img.png");
    nvalue=-128;
}
void MyQLabel::valueChanged(int value)
{
        nvalue = value;
        this->update();
}
void MyQLabel::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.save();//保存
    painter.setRenderHint(QPainter::SmoothPixmapTransform, true); //平滑像素图,防止图形走样
    painter.translate(this->width() / 2,this->height() / 2); // 原点定位在中间位置
    qDebug()<<"1.width:"<<this->width()/2 <<"height:"<<this->height()/2 <<endl;
    painter.drawPixmap(-img.width()/2, -img.height() / 2, img);   // 背景图
    qDebug()<<"2.width:"<<img.width() <<"height:"<<img.height() <<endl;// 指针图
    painter.restore();//恢复
    painter.translate(this->width() / 2,this->height()/8*5); // 原点定位在中间位置
    qDebug()<<"3.定位点.width:"<<this->width() / 2 <<"height:"<<this->height() /8*5<<endl;
    painter.rotate(nvalue);//设置旋转角度
    painter.drawPixmap(-needle.width() / 2, -needle.height() + needle.width() / 2, needle);         //原点图
    painter.drawPixmap(-overlay.width() / 2, -overlay.height()/2 , overlay);
    painter.restore();//恢复
}

3. widget.h 文件

#include <QWidget>

#include <QPaintDevice>

#include <QPainter>

#include <QPaintEvent>

#include <QPixmap>

#include <QInputDialog>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget(QWidget *parent = 0);

~Widget();

private slots:

void on_pushButton_clicked();

void on_slider_valueChanged(int value);

private:

 Ui::Widget *ui;

};

#endif // WIDGET_H

4. widget.cpp

#include "ui_widget.h"

#include <QDebug>

#include <QLabel>

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)

{

      ui->setupUi(this);

     resize(600,600); //设置窗体大小

}

//析构函数

Widget::~Widget()

{

delete ui;

}

void Widget::on_pushButton_clicked()

{

int evalue=QInputDialog::getInt(this,tr("输入温度数值"),tr("请输入一个对应的温度值"),0,-128,128,1);

ui->label->valueChanged(evalue);

}

//值变化时

void Widget::on_slider_valueChanged(int value)

{

qDebug()<<"value="<<value<<endl;

ui->label->valueChanged(value);

}

5. main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

Widget w;

w.show();

return a.exec();

}

6. widget.ui

这个界面中放置一个QLabel控价,到时提升下控件即可

最终实现效果如下


http://www.niftyadmin.cn/n/5862598.html

相关文章

探索分布式 IO 模块网络适配器

在自动化控制领域&#xff0c;分布式 IO 模块网络总线适配器&#xff0c;也就是耦合器模块&#xff0c;发挥着极为关键的作用。但对于很多非专业人士来说&#xff0c;这个名字听起来既陌生又晦涩。别担心&#xff0c;接下来就让我们一起深入了解它。 什么是耦合器模块 耦合器…

多线程和并发篇

多线程和并发篇 创建一个对象时底层汇编指令实现步骤&#xff08;cpu可能会进行指令重排序&#xff09;&#xff1a;一、二、三级缓存的实现&#xff1a;并发编程三要素&#xff1a;线程的五大状态&#xff1a;创建线程的三种方式&#xff1a;线程的特征和状态&#xff1a;Thre…

vue 判断一个属性值,如果是null或者空字符串或者是空格没有值的情况下,赋值为--

在 Vue 中&#xff0c;可以通过多种方式来判断一个属性值是否为 null、空字符串或者仅包含空格&#xff0c;如果满足这些条件则将其赋值为 --。下面分别介绍在模板和计算属性、方法中实现的具体做法。 1. 在模板中直接判断 如果只需要在模板中对属性值进行显示处理&#xff0c…

分布式光伏运维云平台:智能化运维,助力光伏电站高效运行

1光伏背景 行业背景--国家政策 发改能源〔2022〕206号文件指出&#xff1a;“在农村地区优先支持屋顶分布式光伏发电以及沼气发电等生物质能发电接入电网&#xff0c;电网企业等应当优先收购其发电量。”《国家能源局综合司关于报送整县&#xff08;市、区&#xff09;屋顶分…

无人机遥控器接口作用详解!

USB接口&#xff1a; 功能&#xff1a;USB接口是一种通用串行总线接口&#xff0c;用于连接外部设备&#xff0c;如手机、平板、电脑或充电设备。在无人机遥控器上&#xff0c;USB接口通常用于数据传输和充电。 应用&#xff1a;用户可以通过USB接口将遥控器与电脑连接&#…

rabbitMq创建队列和交换机不成功的问题(解决方案和排查问题思路)

问题背景: 1.SpringbootRabbitmq项目启动后不能自动创建交换机和队列 2.消费者和生产者是在2个不同微服务中 3.先启动生产者的模块, 启动成功, 但是交换机和队列没有创建, 然后启动消费者一直启动失败 4.生产者的微服务配置了交换机队列和绑定key的声明, 消费者直接监听了队…

Docker 部署AnythingLLM

两个指令搞定 1.下载镜像 docker pull mintplexlabs/anythingllm 2.运行容器 export STORAGE_LOCATION$HOME/anythingllm mkdir -p $STORAGE_LOCATION chmod -R 777 $STORAGE_LOCATION touch "$STORAGE_LOCATION/.env" docker run -d -p 3001:3001 \ --cap-add SY…

设计模式教程:中介者模式(Mediator Pattern)

中介者模式是一种行为型设计模式&#xff0c;它用于减少对象之间的直接依赖关系。通过引入一个中介者对象&#xff0c;所有对象的交互都通过中介者进行&#xff0c;而不是直接相互通信。这种模式的主要目的是减少对象之间的耦合&#xff0c;提升系统的灵活性和可维护性。 1. 定…