【快速上手QT】05-绘画Paint

我们写一个QT程序,说实话,很难昧着良心说这个QT界面很好看(技术高超的小伙伴请忽略我这句话)。但是我们可以使用绘画事件来弥补一下“相貌丑陋”的这个缺点。

paintEvent

我们可以对主界面进行绘图,从而达到美化界面的效果。

在QT助手中搜索QWidget我们可以发现下面这个函数,我们要用的就是它——绘图事件。

我们需要在这个绘图事件中对界面进行绘图。在绘图事件之外的地方进行绘画是无效的。

我们绘图的话使用的是QPainter这个类。

QPainter

可以从上面看出它没有父类了,这样就比较省事了,因为我们需要什么函数直接在这边找就可以了,而不用动不动就翻它的父类去找。

一般来说要用它去画一些什么东西,它的成员函数名就是drawXXX,因此只要你英语够好,那么甚至都不需要QT助手,只需要靠IDE的代码提示就可以自由绘画。

绘画的相关函数比较多,并且重载也多,大家自己去QT助手里找,我下面就直接进行演示。

#include "Zhetu.h"

#include <qdebug.h>
#include <qpainter.h>

void Zhetu::paintEvent(QPaintEvent* e) {
	QPainter* paint = new QPainter(this);
	for (int i = 1; i < 100; i++) {
		paint->drawPoint(i, 100);
	}
	paint->drawEllipse(100, 100, 100, 100);
	paint->drawLine(50, 50, 200, 200);
	paint->drawRect(80, 80, 100, 100);
}

Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){
	this->setFixedSize(500, 500);

}

Zhetu::~Zhetu()
{}

我上面使用了画圆,矩阵,线,点的函数,因为一个点不明显,所以我画了一百个,一百个点连起来也变成了一条线。

然后上面的我们基本上用不到,因为如我们所见,画出来的很丑,所以我们一般是自己另外画一个比较好看的图片然后再贴到页面上的,就跟网页前端一样,是可以自己画一些线条,但是大部分情况下都是直接贴图的。

那么接下来我们就需要使用QPainter去画一个图片了。

画图以及添加加载资源

一般情况下没有别的要求的时候,我们画图用的成员函数是drawPixmap。

重载函数有下面这么多个,但是我个人常用的还是红框框起来的最后一个。

可以看的出来,参数的意思就是指定绘图的左上角顶点的x和y坐标,以及这个图片的宽高,最后一个参数给一个QPixmap类型的变量,可以知道这个QPixmap就是用来指定我们画什么图片的。

这边补充一下之前没提的点,那就是绘图中的x轴和y轴,跟我们数学中的xy轴差不多,只不过不同的是QT中的y轴的正反方向是反过来的,其他一样。

我们再来看看QPixmap这个类。

它的众多构造函数里我们注意我红框框起来的这个,我们一般情况下只需要传入一个参数即可,那就是第一个参数——文件路径。

这个文件路径可以填相对路径也可以填绝对路径。

但是我们一般填的是QT的资源路径。

也就是我们需要自己去添加的资源,我们先双击打开.prc文件。

点开后我们可以发现我们的资源是一片空白。这时候我们点击我方框框起来的add,先选择add prefix添加前缀,我们先随便起一个名字(一般是和我们需要添加的资源相关的名字)

在圆框里选中其中一个前缀之后再点击add,这一次我们选择add files,然后选择我们要添加的文件资源。需要注意的是需要和我们的工程文件在同一个目录或是子目录下,并且路径不能有中文!!!!!!!

添加完保存完之后我们就可以回到代码里使用了。

#include "Zhetu.h"

#include <qdebug.h>
#include <qpainter.h>

void Zhetu::paintEvent(QPaintEvent* e) {
	QPainter* paint = new QPainter(this);
	QPixmap p(":/images/image/background.png");
	paint->drawPixmap(0, 0, 650, 400, p);
}

Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){
	this->setFixedSize(650, 400);
}

Zhetu::~Zhetu()
{}

使用方法也很简单,也就是在写文件路径的时候改为冒号:加上我们之间添加的资源路径前缀,再加上文件路径。

甚至如果你嫌太长了,还可以给资源文件路径起个别名,这样子别名就可以代替文件路径,也就是变成冒号加前缀加别名。

效果是一样的。

绘画刷新

有些时候我们需要让图片动起来,那么我们就需要频繁地更改绘画的内容,也就是说需要频繁地触发绘画事件。这时候就需要说一下触发绘画事件的条件了,就是加载页面以及我们手动调用update函数的时候了。

当我们打开程序的时候,页面初次加载,自然是会自动触发绘画事件。而我们将程序最小化之后再打开,也是会触发绘画事件的。而我们手动地调用update函数的时候也是会触发绘画事件。

因此我如果需要让界面动起来,那么会配合定时器事件,在定时器事件里调用update,使得整个界面具有动画效果。

#include "Zhetu.h"

#include <qdebug.h>
#include <qpainter.h>

int cx = 0, cy = 100;
void Zhetu::paintEvent(QPaintEvent* e) {
	QPainter* paint = new QPainter(this);
	QPixmap p(":/images/b");
	paint->drawPixmap(0, 0, 650, 400, p);

	QPixmap chick(":/images/c");
	paint->drawPixmap(cx, cy, 50, 50, chick);
	cx += 5;
}

void Zhetu::timerEvent(QTimerEvent* e){
	update();
}

Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){
	this->setFixedSize(650, 400);
	this->startTimer(40);
}

Zhetu::~Zhetu()
{}

我们人眼能感到流畅的画面帧数是25左右,因此我这边定时器设为40ms一次,每次定时器都调用update。

在绘画事件中每次都将坤坤的x轴坐标加上5个像素点,这样我们就可以得到一个移动的坤坤了。

小结

这个系列写到第五篇了,小伙伴们自己去查一查检测按键输入的相关操作之后就可以尝试去写一下我之前xxx行代码写一个xxx系列的QT小游戏了。

关于QT,可以说是非常简单的,主要就是要动手多练,所以各位小伙伴多多加油吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js设计模式:计算属性模式

作用: 将对象中的某些值与其他值进行关联,根据其他值来计算该值的结果 vue中的计算属性就是很经典的例子 示例: let nowDate 2023const wjtInfo {brithDate:1995,get age(){return nowDate-this.brithDate}}console.log(wjtInfo.age,wjt年龄)nowDate 1console.log(wjtInf…

【UI自动化】使用poco框架进行元素唯一定位

直接选择&#xff1a; 1.poco(text买入).click() 2.poco("android.widget.ImageView").click()相对选择、空间选择&#xff1a; 3.poco(text/name).parent().child()[0].click()正则表达式&#xff1a; 4.listpoco(textMatches".*ETF")今天主要想记录下…

操作系统导论-课后作业-ch19

1. 本书在第6章中有过介绍&#xff0c;gettimeofday函数最多精确到us&#xff0c;并且大致精确&#xff08;并不完全精确&#xff09;&#xff0c;需要多迭代几次减少误差&#xff0c;循环次数太多也会导致结束时间小于开始时间&#xff08;即回滚&#xff09;的现象&#xff…

Kaggle实践之《Home Credit Default Risk》的逐步优化

记录下每一次的改进及其score。 1、只用训练集的特征简单处理 特征只用训练集的特征&#xff0c;把string型的特征全部进行one-hot转化&#xff0c;然后随机1:4分成测试集训练集&#xff0c;模型也调参直接出结果。 最终的score是训练集80.13%、验证集76.33%、线上74.28%。 …

Java 注解机制解密并发编程的时间之谜:揭开Happens-Before的神秘面纱

优质博文&#xff1a;IT-BLOG-CN 一、简介 为什么需要happens-before原则&#xff1a; 主要是因为Java内存模型 &#xff0c; 为了提高CPU效率&#xff0c;通过工作内存Cache代替了主内存。修改这个临界资源会更新work memory但并不一定立刻刷到主存中。通常JMM会将编写的代码…

⭐北邮复试刷题LCR 052. 递增顺序搜索树__DFS (力扣119经典题变种挑战)

LCR 052. 递增顺序搜索树 给你一棵二叉搜索树&#xff0c;请 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子节点&#xff0c;只有一个右子节点。 示例 1&#xff1a; 输入&#xff1a;root [5,…

零基础学习8051单片机(十六)

继续学习8051单片机&#xff0c;本次通过观看视频在此学习8051单片机的中断系统 要掌握单片机中断系统的硬件结构和工作原理 掌握&#xff1a;中断系统的初始化编程以及中断服务子程序设计。 一、中断的基本过程图&#xff1a; 中断的响应和处理过程&#xff1a; 当中断提出…

Redis篇----第十三篇

系列文章目录 文章目录 系列文章目录前言一、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key是以某个固定的已知的前缀开头的,如果将它们全部找出来?二、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?三、使用过 Redis 做异步队列么,你是怎么用的?四、使用…

Apache Doris 发展历程、技术特性及云原生时代的未来规划

文章目录 作者介绍 Apache Doris特性极简结构高效自运维高并发场景支持MPP 执行引擎明细与聚合模型的统一便捷数据接入 Apache Doris 极速 1.0 时代极速 关于 Apache Doris 开源社区基于云原生向量数据库 Milvus 的云平台设计实践作者介绍图书推荐 本文节选自《基础软件之路&am…

第六篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:深度解读Kaldi库个性化定制语音搜索引擎

传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、雏形示例代码二、扩展思路介绍三、数据准备示例代码四、特征提取示例代码五、声学模型训练示例代码六、语言模型训练示例代码七、解码示例代码八、评估和调优示例代码九、…

LeetCode | 寻找两个正序数组的中位数 Python C语言

Problem: 4. 寻找两个正序数组的中位数 文章目录 思路解题方法Code结果结果一些思考 思路 先合并&#xff0c;后排序&#xff0c;最后找中间轴。 解题方法 由解题思路可知 Code 这是python3的代码。 class Solution(object):def findMedianSortedArrays(self, nums1, num…

分享Video.js观看Web视频流

界面效果 HTML结构 <div class"homePopup" ><div class"search_box animate__animated animate__fadeInDown" style"display: none;"><div class"van-search" style"background: rgba(0, 0, 0, 0);">&…

【云原生】Docker consul的容器服务更新与发现

目录 什么是服务注册与发现 什么是consul consul提供的一些关键特性&#xff1a; consul 部署 consul服务器 1. 建立 Consul 服务 设置代理&#xff0c;在后台启动 consul 服务端 2. 查看集群信息 查看members状态 查看集群状态 3. 通过 http api 获取集群信息 regi…

SpringBoot指定外部环境配置

nohup java -Xms256m -Xmx512m -Dfile.encodingUTF-8 -jar /usr/local/xxxx.jar --spring.profiles.activeprod > system.log 2>&1 & --spring.profiles.activeprod修改的是多环境配置中内部application.properties里的spring.profiles.active值 -Dspring.config…

新手初期交易是盈利的,等熟练了却开始亏损了?

许多个人投资者涌入市场&#xff0c;初衷是期望能实现暴利并创造奇迹。梦想是美好的&#xff0c;追求暴利也无可非议&#xff0c;但最担心的是一开始就设定了不切实际的目标。例如&#xff0c;他们可能认为&#xff0c;若一年内不能赚取五倍或十倍的收益&#xff0c;就等于失败…

【AI大语言模型】ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

Android13 编译ninja failed with: exit status 137

描述 现象很奇怪&#xff0c;主机是ubuntu 18.04&#xff0c; 内存有32G&#xff0c;并且系统中有两份Android13代码&#xff0c; 有一份编译正常&#xff0c;另外一份编译不正常&#xff0c;一度以为是因为下载源码不齐全导致&#xff0c;后面仔细看日志&#xff0c;原来是内…

同步系统时间chrony

安装 yum install chrony 启动并启用chronyd服务&#xff1a; systemctl start chronyd systemctl enable chronyd 查看chrony的状态&#xff0c;确认是否已经与NTP服务器同步 chronyc tracking

ElasticSearch DSL查询、排序 、分页的原理及语法

1. DSL查询分类和基本语法 ElasticSearch提供了基于Json的DSL来定义查询&#xff0c;常见的查询类型包括&#xff1a; • 查询所有&#xff1a;查询出所有数据&#xff0c;一般测试用&#xff0c;一般不是查出所有&#xff0c;一次性查询20条。例如 match_all • 全文检索(ful…

RMAN备份与恢复

文章目录 一、RMAN介绍二、全量备份三、增量备份0级备份1级增量备份累积性差量备份总结 四、压缩备份压缩备份介绍压缩备份操作压缩备份优缺点 五、异常恢复1、恢复前的准备2、恢复数据库 六、RMAN相关参数 一、RMAN介绍 RMAN&#xff08;Recovery Manager&#xff09;是Oracl…