linux系统中利用QT实现绘制图和图标的方法

news2024/11/28 19:27:39

      大家好,今天主要和大家聊一聊,如何使用QT进行绘图和图标的方法。

 第一:绘图和图表简介

      绘图与图表在嵌入式里有的比较多,尤其是图表,我们常在股票里看到的“图表折线/曲线图/饼状图等”都可以用 Qt 的图表来实现。绘图和图表的内容本章主要介绍绘图和图表的基本操作,以简单的例子呈现绘图与图表的用法,目的就是快速入门绘图与图表

     QT里面所有的绘图,比如一个按钮和一个Label的显示,都有绘图系统来执行。绘图系统基于QPainter和QPaintDevice类。QPainter 是可以直接用来操作绘图的类,而 QPaintDevice 和 QPainEngine 都比 QPainter 更底层,我们只需要了解一下 QPaintDevice 和 QPainEngine 就行了。可以用下面一张图来表示它们的关系。

第二:绘图应用实例

      本次使用一张CD图片,用QPainter在paintEvent()将 CD 画在窗口的中心,并且每 100ms 旋转 1 度角度。所以 CD 看起来是旋转了的效果。

//在头文件“mainwindow.h”的具体代码实现如下
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QPainter>
6 #include <QPaintEvent>
7 #include <QTimer>
8
9 class MainWindow : public QMainWindow
10 {
11 Q_OBJECT
12
13 public:
14 MainWindow(QWidget *parent = nullptr);
15 ~MainWindow();
16
17 /* 重写父类下的 protected 方法*/
18 protected:
19 void paintEvent(QPaintEvent *);
20
21 private:
22 /* 定时器,用于定时更新界面 */
23 QTimer *timer;
24 /* 角度 */
25 int angle;
26
27 private slots:
28 /* 槽函数 */
29 void timerTimeOut();
30
31 };
32 #endif // MAINWINDOW_H

   第 18 行,因为 paintEvent()是父类 QWidget protected 修饰符下虚方法(虚函数),所以建议重写时也写到子类下的 protected 修饰符下。

第三:源文件mainwindow.cpp的具体实现

1 #include "mainwindow.h"
2 #include "QDebug"
3 MainWindow::MainWindow(QWidget *parent)
4 : QMainWindow(parent)
5 {
6 /* 设置主窗口位置及颜色 */
7 this->setGeometry(0, 0, 800, 480);
8 setPalette(QPalette(Qt::gray));
9 setAutoFillBackground(true);
10
11 /* 定时器实例化 */
12 timer = new QTimer(this);
13
14 /* 默认角度为 0 */
15 angle = 0;
16
17 /* 定时 100ms */
18 timer->start(100);
19
20 /* 信号槽连接 */
21 connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));
22 }
23
24 MainWindow::~MainWindow()
25 {
26 }
27
28 void MainWindow::timerTimeOut()
29 {
30 /* 需要更新界面,不设置不更新 */
31 this->update();
32 }

34 void MainWindow::paintEvent(QPaintEvent *)
35 {
36 /* 指定父对象,this 指本窗口 */
37 QPainter painter(this);
38
39 /* 设置抗锯齿,流畅转换 */
40 painter.setRenderHints(QPainter::Antialiasing
41 | QPainter::SmoothPixmapTransform);
42 /* 计算旋转角度 */
43 if (angle++ == 360)
44 angle = 0;
45
46 /* QPixmap 类型对象 */
47 QPixmap image;
48
49 /* 加载 */
50 image.load(":/image/cd.png");
51
52 /* QRectF 即,继承 QRect(Qt 的矩形类),F 代表精确到浮点类型 */
53 QRectF rect((this->width() - image.width()) / 2,
54 (this->height() - image.height()) / 2,
55 image.width(),
56 image.height());
57
58 /* 默认参考点为左上角原点(0,0),因为旋转需要以图形的中心为参考点,
59 * 我们使用 translate 把参考点设置为 CD 图形的中心点坐标 */
60 painter.translate(0 + rect.x() + rect.width() / 2,
61 0 + rect.y() + rect.height() / 2);
62
63 /* 旋转角度 */
64 painter.rotate(angle);
65
66 /* 现在参考点为 CD 图形的中心,我们需要把它设置回原点的位置,
67 * 所以需要减去上面加上的数 */
68 painter.translate(0 - (rect.x() + rect.width() / 2),
69 0 - (rect.y() + rect.height() / 2));
70
71 /* 画图,QPainter 提供了许多 drawX 的方法 */
72 painter.drawImage(rect, image.toImage(), image.rect());
73
74 /* 再画一个矩形 */
75 painter.drawRect(rect.toRect());
}
34~76 行, paintEvent() 的实现。首先先指定需要画图的对象,加图片后,使用 translate()
设置参考原点,旋转一定的角度后再恢复参考原点。之后就开始画图。

第四:运行效果

      编译运行程序后可以看到如下效果,CD的外框加画一个矩形,使旋转更明显。使用paintEvent 可以实现一些需要绘图的情景,它可能比 Qt 动画类更容易实现。
        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生产制造业如何谋求数字化转型?需要哪些信息化系统做支撑?

生产制造业数字化转型有什么思路&#xff1f;生产制造业需要哪些信息化系统做支撑&#xff1f; 近年来&#xff0c;围绕新产品新模式新业态&#xff0c;国家重点部署了7个方向&#xff0c;包括数字化管理、平台化设计、智能化生产、网络化协同、个性化定制、服务化延伸、新型智…

Revit图纸问题:设置dwg图纸显示顺序和批量图纸编号

一、Revit中设置导入的dwg图纸的显示顺序 我们在实际工作中经常需要将各种DWG图纸导入到revit中进行参考&#xff0c;有时候希望它盖住已有模型&#xff0c;有时候又需要它在模型以下显示&#xff0c;即实现类似于CAD的图层显示顺序功能&#xff0c;应该如何才能实现呢&#xf…

Window Server 2022 无法安装网卡驱动 1219-v

安装过win10的朋友都知道,win10基本上不用自己下载驱动. 插上网线就能用. 但是今天在server2022上,死活无法安装成功. 原因有很多,网上也有很多资料. 重点: 其实不需要修改驱动配置, 只需要在驱动中选择对应驱动,比如: 1219[x]-LM,x标识很多版本,选择一个低一点的就可以了. …

MySQL - explain 执行计划详解

explain显示了MySQL如何使用索引来处理select语句以及连接表&#xff0c;可以帮助选择更好的索引和写出更优化的查询语句。 explain 查询结果如下&#xff1a; 字段说明&#xff1a; 列名说明id id列的编号是select的序列号&#xff0c;有几个select就有几个id&#xff0c;并…

IPEmotion的NVH噪声测试模块——坎贝尔图

德国IPETRONIK的IPEmotion软件除了可以对之前介绍的热管理试验及热管理台架试验、电性能试验和道路试验等各种进行基本的温度、模拟量和数字信号的采集分析外&#xff0c;无论专业版、开发版还是分析版均支持噪声分析模块。该模块支持噪声数据离线后处理&#xff0c;包括Campbe…

如何通过大数据赋能产业园区高质量发展

2022年年底&#xff0c;中共中央、国务院印发了《关于构建数据基础制度更好发挥数据要素作用的意见》(以下简称《数据二十条》)&#xff0c;以《数据二十条》出台为标志&#xff0c;我国数字经济发展从技术引领进入到数据驱动的新阶段&#xff0c;加快构建数据基础制度&#xf…

LINUX提权之第三方服务提权篇

前言 上一篇文章讲了一下环境变量提权不知道大家学习的怎么样了&#xff0c;今天给大家带来新的提权知识——“第三方服务提权”&#xff0c;本文会深入浅出讲解一下第三方服务提权的原理以及例子。 第三方服务 所谓的第三方服务可以大致理解为系统中安装的软件&#xff08;…

机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例

机器人中的数值优化|【二】最优化方法&#xff1a;最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbrock function为例 在上一节中提到了我们详细探讨了数值优化/最优化理论中的基本概念和性质&#xff0c;现在开始使用python对算法进行实现。上一节链接&am…

CVE-2021-25296 复现

# 漏洞描述 名称&#xff1a;Apache OFBiz rmi反序列化漏洞 cve编号&#xff1a;cve-2021-25296 危害&#xff1a;未授权远程命令执行 影响版本&#xff1a;Apache OFBiz < 17.12.06 OFBiz是一个非常著名的电子商务平台&#xff0c;是一个非常著名的开源项目&#xff0…

Python识别屏幕题目并模拟做题

前言 马上就要过年了&#xff0c;有许多小伙伴们本本还没拿到&#xff0c;还在苦苦刷题&#xff0c;一直及格不了&#xff0c;现在&#xff0c;我们用Python模拟做题&#xff0c;看看效果。 环境使用 python 3.9pycharm 模块使用 requestsreselenium谷歌驱动 import reimpor…

动态规划|474. 一和零

题目看上去很唬人&#xff0c;但是恰恰是这样说明该题设计的目的很强&#xff0c;指向dp的01背包&#xff0c;就是为了考01背包设计的。 像极了中学时代的那种看上去花里胡哨&#xff0c;实质上是根据考点设计出题的题目。&#xff08;这种题看破出题意图&#xff0c;往往都很简…

电脑是自动获取ip,VMware安装linux时候,设置固定ip并且能访问外网

首先虚拟机网络模式是NAT模式。设置主机名和打开网络&#xff0c;也可以不设置主机名&#xff1a;安装好后&#xff0c;设置linux的ip地址。执行vi /etc/sysconfig/network-scripts/ifcfg-ens33&#xff0c;修改里面的ip配置&#xff1a;注意IP的范围。查看ip的范围的方法如下图…

Day 5 Spring的后处理器

1 Spring后处理器Spring的后处理器是Spring对外开发的重要扩展点&#xff0c;允许我们介入到整个Bean实例化流程中来&#xff0c;以达到动态注册BeanDefinition&#xff0c;动态修改BeanDefinition&#xff0c;以及动态修改Bean的作用。BeanFactoryPostProcessor: Bean工厂后处…

基于蜜蜂算法求解电力系统经济调度(Matlab代码实现)

目录 1 蜜蜂优化算法 1.1 蜂群觅食机制 1.2 蜜蜂算法 1.3 流程 2 经济调度 3 运行结果 4 参考文献 5 Matlab代码实现 1 蜜蜂优化算法 蜜蜂算法( Bees Algorithm&#xff0c;BA) 由英国学者 AfshinGhanbarzadeh 和他的研究小组于 2005 年提出。该算法是一种有别于蚁群…

学习使用php获取数组最大值并返回对应键名max和array_search函数,最后一个元素的值使用end函数

在php中&#xff0c;可以使用max函数和array_search函数获得数组的最大值&#xff0c;同时获得最大值对应的键名解决方案打印结果解决方案 使用max函数获得数组的最大值&#xff0c;并使用array_search函数找到最大值对应的键名&#xff0c;键名保存在$key变量中。 end() 函数…

android架构拆分方案

编译拆https://blog.csdn.net/dongyi1988/article/details/128629011结构拆https://blog.csdn.net/dongyi1988/article/details/128633808一、背景android设备已经遍及各行各业&#xff0c;手机整个项目阶段包括需求沟通&#xff0c;硬件设计打板&#xff0c;研发联调&#xff…

新网站如何快速被收录?网站收录如何查询

新网站如何快速被收录? 首先是向搜索引擎提交 各大搜索引擎都向网站提供了自动提交功能&#xff0c;而百度搜索引擎也有网站提交入口&#xff0c;主动提交网站能够增加百度收录几率&#xff0c;让搜索引擎尽快发现我们的网站已经上线。 然后是做好SEO优化&#xff1b; 1.网站内…

强(矩阵快速幂)

题目描述 Lh&#xff1a;粉兔你教我一下抽屉原理吧 Clz&#xff1a;就是给你一个长度为 n 的序列&#xff0c;每个数只能取 0,1,2&#xff0c;那你连续取三个数必然有两个相等…… Lh&#xff1a;等等你梭啥&#xff0c;再说一遍 Clz&#xff1a;……emmm 当我没说 Marser&…

测试框架 Jest 实用教程

官网 https://jestjs.io/docs/getting-started 安装 cnpm i --save-dev jest使用 在项目中的任意位置&#xff08;通常单独建个名为 test 的文件夹&#xff09;新建以 .test.js 为后缀的测试文件&#xff0c;如 expect.test.js &#xff08;若项目中有 test.js 存在&#xff0c…

【阶段三】Python机器学习10篇:机器学习项目实战:K近邻算法的基本原理、计算步骤与KNN(K近邻)分类模型

本篇的思维导图: K近邻算法(英文为K-Nearest Neighbor,因而又简称KNN算法)是非常经典的机器学习算法。 K近邻算法的基本原理 K近邻算法的原理非常简单:对于一个新样本,K近邻算法的目的就是在已有数据中寻找与它最相似的K个数据,或者说“离它最近”的K个数…