用Qt画一个温度计
示例1
以下是用Qt绘制一个简单的温度计的示例代码:
#include <QPainter>
#include <QWidget>
#include <QApplication>
class Thermometer : public QWidget {
public:Thermometer(QWidget *parent = 0);
protected:void paintEvent(QPaintEvent *event);
private:int value;
};
Thermometer::Thermometer(QWidget *parent): QWidget(parent), value(50) {}
void Thermometer::paintEvent(QPaintEvent * /* event */) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setPen(Qt::NoPen);// 绘制温度计背景painter.setBrush(QColor("#f0f0f0"));painter.drawRect(0, 0, width(), height());// 绘制温度计外框painter.setBrush(QColor("#f5f5f5"));painter.drawRect(20, 20, width() - 40, height() - 40);// 绘制温度计刻度线painter.setPen(QColor("#999999"));for (int i = 0; i <= 100; i += 10) {painter.drawLine(40, height() - 40 - (i * (height() - 80) / 100),60, height() - 40 - (i * (height() - 80) / 100));}// 绘制温度计当前温度painter.setPen(QColor("#ff0000"));painter.setFont(QFont("Arial", 14));painter.drawText(80, height() , QString::number(value) + ".");// 绘制温度计水银柱painter.setBrush(QColor("#ff0000"));painter.drawRect(30, height() - 40 - (value * (height() - 80) / 100),width() - 60, value * (height() - 80) / 100);
}
int main(int argc, char *argv[]) {QApplication app(argc, argv);Thermometer thermometer;thermometer.setWindowTitle("thermometer");thermometer.resize(200, 400);thermometer.show();return app.exec();
}
运行结果
示例2
复杂的动态温度计,代码实现如下:
创建一个Qt项目,并添加一个主窗口。
新建Qt Widgets Application项目,添加MainWindow类。
在主窗口上添加一个QLabel控件,用于显示当前温度值。
在MainWindow类的构造函数中添加以下代码:
QLabel *tempLabel = new QLabel(this);
tempLabel->setText("Temp: 0℃");
tempLabel->setGeometry(20, 20, 100, 20);
在主窗口上添加一个QGraphicsView控件,用于绘制温度计。
在MainWindow类的构造函数中添加以下代码:
QGraphicsView *view = new QGraphicsView(this);
view->setGeometry(20, 50, 200, 200);
创建一个QGraphicsScene对象,并将其设置为QGraphicsView的场景。
在MainWindow类的构造函数中添加以下代码:
QGraphicsScene *scene = new QGraphicsScene(this);
view->setScene(scene);
在QGraphicsScene中添加一个QGraphicsRectItem对象,用于表示温度计的外框。
在MainWindow类的构造函数中添加以下代码:
QGraphicsRectItem *frame = new QGraphicsRectItem(0, 0, 200, 200);
frame->setPen(QPen(Qt::black));
frame->setBrush(QBrush(Qt::white));
scene->addItem(frame);
在QGraphicsScene中添加一个QGraphicsEllipseItem对象,用于表示温度计的中心点。
在MainWindow类的构造函数中添加以下代码:
QGraphicsEllipseItem *center = new QGraphicsEllipseItem(90, 90, 20, 20);
center->setPen(QPen(Qt::black));
center->setBrush(QBrush(Qt::black));
scene->addItem(center);
在QGraphicsScene中添加一些QGraphicsLineItem对象,用于表示温度计的刻度线。
在MainWindow类的构造函数中添加以下代码:
for (int i = -45; i <= 225; i += 45) {QLineF line(100 + 80 * cos(i * M_PI / 180),100 - 80 * sin(i * M_PI / 180),100 + 100 * cos(i * M_PI / 180),100 - 100 * sin(i * M_PI / 180));QGraphicsLineItem *tick = new QGraphicsLineItem(line);tick->setPen(QPen(Qt::black));scene->addItem(tick);
}
在QGraphicsScene中添加一个QGraphicsPolygonItem对象,用于表示温度计的指针。
在MainWindow类的构造函数中添加以下代码:
QPointF points[3] = { QPointF(100, 100),QPointF(95, 90),QPointF(105, 90) };
QGraphicsPolygonItem *pointer = new QGraphicsPolygonItem(QPolygonF(points, 3));
pointer->setPen(QPen(Qt::black));
pointer->setBrush(QBrush(Qt::red));
pointer->setTransformOriginPoint(100, 100);
scene->addItem(pointer);
通过QGraphicsTransform对象,将温度计的指针进行旋转,以显示当前温度值。
在MainWindow类中添加以下私有成员变量:
QGraphicsTransform *pointerTransform;
在MainWindow类的构造函数中添加以下代码:
pointerTransform = new QGraphicsTransform(pointer);
pointer->setTransform(pointerTransform);
在MainWindow类中添加以下槽函数:
void MainWindow::updateTemp(int temp) {ui->tempLabel->setText(QString("Temp: %1℃").arg(temp));pointerTransform->setRotation(-45 + temp * 270 / 100);
}
在主窗口的槽函数中更新温度值,并更新温度计的指针的旋转角度。
在MainWindow类中添加以下信号:
signals:void tempChanged(int temp);
在MainWindow类的构造函数中添加以下代码:
connect(this, SIGNAL(tempChanged(int)), this, SLOT(updateTemp(int)));
在MainWindow类中添加以下槽函数:
void MainWindow::on_tempSlider_valueChanged(int value)
{emit tempChanged(value);
}
在主窗口上添加一个QSlider控件,并将其范围设置为0-100,在MainWindow类中添加以下信号槽连接:
connect(ui->tempSlider, SIGNAL(valueChanged(int)), this, SLOT(on_tempSlider_valueChanged(int)));
相关文章:

用Qt画一个温度计
示例1 以下是用Qt绘制一个简单的温度计的示例代码: #include <QPainter> #include <QWidget> #include <QApplication> class Thermometer : public QWidget { public:Thermometer(QWidget *parent 0); protected:void paintEvent(QPaintEvent …...

Java设计模式 04-建造者模式
建造者模式 一、 盖房项目需求 1)需要建房子:这一过程为打桩、砌墙、封顶 2)房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的. 3)请编写程序,完成需求. …...
安语未公告于2023年3月20日发布
因一些特殊原因,凡事都是有开始,高潮和结束三大过程,做出以下决定: 所有对 安语未文章 为之热爱、鞭策、奉献,和支持过的开发者: 注:所有资源以及资料都会正常下载和查看 如需联系࿱…...

进销存是什么?如何选择进销存系统?
什么是进销存?进销存软件概念起源于上世纪80年代,由于电算化的普及,计算机管理的推广,不少企业对于仓库货品的进货,存货,出货管理,有了强烈的需求,进销存软件的发展从此开始。 进入…...
基于BP神经网络的图像跟踪,基于BP神经网络的细胞追踪识别
目录 摘要 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络激活函数及公式 基于BP神经网络的细胞识别追踪 matab编程代码 效果 结果分析 展望 摘要 智能驾驶,智能出行是现代社会发展的趋势之一,其中,客量预测对智能出行至关重要,…...

Java面试总结篇
引用介绍 1.线程安全不安全的概念 线程安全: 指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行程序时出现意外结果。 线程不安全: 是指不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏…...

100天精通Python(可视化篇)——第80天:matplotlib绘制不同种类炫酷柱状图代码实战(簇状、堆积、横向、百分比、3D柱状图)
文章目录0. 专栏导读1. 普通柱状图2. 簇状柱形图3. 堆积柱形图4. 横向柱状图5. 横向双向柱状图6. 百分比堆积柱形图7. 3D柱形图8. 3D堆积柱形图9. 3D百分比堆积柱形图0. 专栏导读 🏆🏆作者介绍:Python领域优质创作者、CSDN/华为云/阿里云/掘金…...

【Java】UDP网络编程
文章目录前言DatagramSocketDatagramPacket注意事项与区别代码演示前言 UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层。 UDP是面向非连接的协议,它不与对方建立连接,而是直接把我要发的数据报发给对…...

Springboot源代码总结
前言 编写微服务,巩固知识 文章目录 前言springboot原理springboot启动流程SpringBoot自动配置底层源码解析自动配置到底配了什么?自动配置类条件注解Starter机制@ConditionalOnMissingBeanSpringBoot启动过程源码解析构造SpringApplication对象SpringBoot完整的配置优先级s…...

JVM监控搭建
文章目录JVM监控搭建整体架构JolokiaTelegrafInfluxdbGrafanaJVM监控搭建 整体架构 JVM 的各种内存信息,会通过 JMX 接口进行暴露。 Jolokia 组件负责把 JMX 信息翻译成容易读取的 HTTP 请求。Telegraf 组件作为一个通用的监控 agent,和 JVM 进程部署在…...
java中如何优化大量的if...else...
目录 策略模式(Strategy Pattern) 工厂模式(Factory Pattern) 映射表(Map) 数据驱动设计(Data-Driven Design) 策略模式(Strategy Pattern) 将每个条件分…...

24. linux系统基础
两个进程间想通讯,必须要通过内核,今天讲的信号其实本质也是讲进程间通讯的意思,那么你为什么可以在shell环境下,可以和一个进程发kill-9啊? shell是不是相当于一个进程?你自己运行的那个进程是不是也相当于…...

【C++】面试101,二叉搜索树的最近公共祖先,在二叉树中找到两个节点的最近公共祖先,序列化二叉树,重建二叉树,输出二叉树的右视图,组队竞赛,删除公共字符
目录 1.二叉搜索树的最近公共祖先 2.在二叉树中找到两个节点的最近公共祖先 3.序列化二叉树 4.重建二叉树 5.输出二叉树的右视图 6.组队竞赛 7.删除公共字符 1.二叉搜索树的最近公共祖先 这是一个简单的问题,因为是二叉搜索树(有序)&am…...

Java常见面试题及解答
Java常见面试题及解答1 面向对象的三个特征2 this,super关键字3 基础数据类型4 public、protected、default、private5 接口6 抽象类6.1 抽象类和接口的区别7 重载(overload)、重写(override)8 final、finalize、final…...

【Docker】镜像的原理定制化镜像
文章目录镜像是什么UnionFS(联合文件系统)Docker镜像加载原理制作本地镜像 docker commit -m"提交的描述信息" -a"作者" 容器ID 要创建的目标镜像名:[标签名]案例演示ubuntu安装vim本地镜像发布到阿里云本地镜像发布到阿里云流程将本…...

国内版的ChatGPT弯道超车的机会在哪里?
前言 从去年11月最后一天ChatGPT诞生,截至目前,ChatGPT的热度可谓是爆了。众所周知,ChatGPT是美国“开放人工智能研究中心”研发的聊天机器人程序,它是一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人…...
【字符串】
string1.char str[]类型fgets(s,10000,stdin) cin.getline(cin,10000) strlen(str)sizeof 求静态数组长度2.string类型getline(cin,a) cin.getline(cin,10000) str.lenth()str.size()cin 遇到空格就停止3.gets 函数char str[20];gets(str);4.puts 函数puts(str) 相当于 cout<…...
加载驱动之后无法在/dev/下生成vedio0
前言 环境介绍: 1.编译环境 Ubuntu 18.04.5 LTS 2.SDK orangepi Linux 5.4 SDK 3.uboot v2020.04 4.gcc gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf 5.单板 orangepi pc plus 一、问题 继上一篇成功加载gc2035.ko文件之后,理论上…...

Java之类与对象(图文结合)
目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象与面向过程 二、类定义和使用 1、简单认识类 2、类的定义格式 3、练习 (1)定义一个狗类 (2)定义一个学生类 三、类的实例化 1、什么是实例化 2、类和对象的…...

基于 VCS-NLP 的动态低功耗仿真验证介绍
🔥点击查看精选 IC 技能树系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...