【Qt绘图】—— 运用Qt进行绘图

news2024/12/22 23:02:02

目录

(一)基本概念

(二)绘制各种形状

2.1 绘制线段

2.2 绘制矩形 

2.3 绘制圆形 

2.4 绘制文本

2.5 设置画笔 

2.6 设置画刷 

(三)绘制图片

3.1 绘制简单图片

3.2 平移图片 

3.3 缩放图片

3.4 旋转图片

(四)其他设置

4.1 移动画家位置

4.2 保存/加载画家的状态 

(五)特殊的绘图设备 

5.1 QPixmap

5.2 QImage

5.3 QPicture


(一)基本概念

虽然Qt已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景.

很多时候我们需要更强的"自定制"能力.

Qt 提供了画图相关的API,可以允许我们在窗口上绘制任意的图形形状,来完成更复杂的界面设计.

  • 所谓的"控件",本质上也是通过画图的方式画上去的.
  • 画图API和控件之间的关系,可以类比成机器指令和高级语言之间的关系.
  • 控件是对画图API的进⼀步封装;画图API是控件的底层实现. 

绘图API核心类 

绘图API的使用,⼀般不会在QWidget的构造函数中使用,而是要放到paintEvent 事件中. 

关于 paintEvent

paintEvent 会在以下情况下被触发:

  • 控件首次创建.
  • 控件被遮挡,再解除遮挡. 
  • 窗口最小化,再恢复. 
  • 控件⼤小发生变化时.
  • 主动调用 repaint() 或者 ...... update() 方法.(这两个方法都是 QWidget 的方法).
  • 因此,如果把绘图api放到构造函数中调用,那么⼀旦出现上述的情况,界面的绘制效果就⽆法确保符合预期了.

(二)绘制各种形状

2.1 绘制线段

示例1:

void drawLine(const QPoint &p1, const QPoint &p2);

参数:
p1:绘制起点坐标
p2:绘制终点坐标


void drawLine {int x1, int y1, int x2, int y2};

参数:
x1,y1:绘制起点坐标
x2,y2:绘制终点坐标

1、在"widget.h"头文件中声明绘图事件;

2、在"widget.cpp"文件中重写paintEvent()方法; 

实现效果如下: 


2.2 绘制矩形 

void QPainter::drawRect(int x, int y, int width, int height);

参数:
x:窗⼝横坐标;
y:窗⼝纵坐标;
width:所绘制矩形的宽度;
height:所绘制矩形的⾼度;

示例如下:


2.3 绘制圆形 

void QPainter::drawEllipse(constQPoint &center, int rx, int ry);

参数:
center:中⼼点坐标
rx:横坐标
ry:纵坐标

示例如下: 


2.4 绘制文本

QPainter类中不仅提供了绘制图形的功能,还可以使用QPainter::drawText()函数来绘制文字,也可以使用QPainter::setFont() 设置字体等信息。 

 示例如下: 

实现效果如下:


2.5 设置画笔 

 QPainter 在绘制时,是有⼀个默认的画笔的。在使用时也可以自定义画笔。在Qt中,QPen类中定义了QPainter应该如何绘制形状、线条和轮廓。同时通过QPen类可以设置画笔的线宽、颜色、样式、 画刷等。

画笔的颜⾊可以在实例化画笔对象时进行设置,画笔的宽度是通过setWidth()⽅法进行设置,画笔的风格是通过setStyle()⽅法进行设置,设置画刷主要是通过setBrush()⽅法。

  • 设置画笔颜色:QPen::QPen(constQColor&color) 画笔的颜色主要是通过QColor类设置;
  • 设置画笔宽度:voidQPen::setWidth(intwidth)
  • 设置画笔风格:voidQPen::setStyle(Qt::PenStylestyle)

画笔的风格有:


示例:画笔的使用

 实现效果如下:


2.6 设置画刷 

在Qt中,画刷是使用QBrush类来描述,画刷大多用于填充。QBrush定义了QPainter的填充模式, 具有样式、颜色、渐变以及纹理等属性。

画刷的格式中定义了填充的样式,使用Qt::BrushStyle枚举,默认值是Qt::NoBrush,也就是不进行任何填充。可以通过Qt助⼿查找画刷的格式。如下图示:

  • 设置画刷主要通过void QPen::setBrush(const QBrush& brush)方法,其参数为画刷的格式。 

示例如下:

实现效果:


(三)绘制图片

Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap和QPicture,它们都是常用的绘图设备。其中QImage主要用来进行I/O处理,它对I/O处理操作进行了优化,而且可以用来直接访问和操作像素;QPixmap主要用来在屏幕上显示图像,它对在屏幕上显示图像进行了优化;QBitmap 是QPixmap的⼦类,用来处理颜色深度为1的图像,即只能显示黑白两种颜色;QPicture用来记录并 重演QPainter命令。本期只讲解QPixmap。

3.1 绘制简单图片

 1. 新建Qt项目,基类选择QWidget,项目名称为QPainter。在"widget.h"头文件中声明绘画事 件;如下图示:

2. 添加资源文件。(⾸先准备⼀些图⽚资源文件,并将这些图⽚资源文放在同⼀个文件夹中,将该文件夹复制到本项目中) 

3. 选中项目文件,鼠标右键------->addnew... ,点击"addnew..."之后选择"Choose...",给资源文件命名,在点击"下⼀步",最后点击“完成”

4. 给资源文件添加前缀,并将资源文件添加至项目中。将所有的资源文件添加到项目中,方便后续使用。最后点击"构建并运行"按钮,将资源文件添加到项目中

5. 在"widget.cpp"文件中实现画图片功能;

实现效果如下:


3.2 平移图片 

平移图片实际是通过改变坐标来实现。QPainter类中提供了translate()函数来实现坐标原点的改变。


3.3 缩放图片

在Qt中,图片的放大和缩小可以使用QPainter类中的drawPixmap()函数来实现。 

示例如下:

实现效果如下:

 


3.4 旋转图片

图⽚的旋转使用的是QPainter类中的rotate()函数,它默认是以原点为中心进行旋转的。如果要改变旋转的中心,可以使用 translate()函数完成。

示例如下:

实现效果如下: 


(四)其他设置

4.1 移动画家位置

有时候在绘制多个图形时,想使用同⼀坐标位置,那么绘制出来的图形肯定会重合,此时,可以通过移动画家的位置来使图形不发生重合。

示例1:未移动画家位置

实现效果如下:


示例2:移动画家位置 

  •  使用 translate 移动画家所在位置.

实现效果如下:


4.2 保存/加载画家的状态 

在绘制图形的过程中,可以通过save()函数来保存画家的状态,使⽤restore()函数还原画家状态。

save() 函数原型如下:

示例如下:

实现效果如下:

 说明:

  • 上述示例中,在画第三个圆之前,由于还原了画家的状态,所以此时画家的位置坐标会移动到画家状态保存的地方,所以在绘制第三个圆的位置时实际是和第⼆个圆发生了重叠。

(五)特殊的绘图设备 

前面的代码中我们是使用QWidget作为绘图设备.在Qt中还存在下列三个比较特殊的绘图设备.此处简要介绍.

  •  QPixmap用于在显示器上显示图片.
  • QImage用于对图片进行像素级修改.
  • QPicture 用于对QPainter的⼀系列操作进行存档.

5.1 QPixmap

QPixmap核心特性:

  • 使用QPainter直接在上⾯进行绘制图形.
  • 通过文件路径加载并显示图⽚.
  • 搭配QPainter的drawPixmap()函数,可以把这个图⽚绘制到⼀个QLabel、QPushButton等控件上.
  • 和系统/显示设备强相关,不同系统/显示设备下,QPixmap的显示可能会有所差别.

示例如下: 

实现效果:

 


5.2 QImage

QImage的核心特性:

  • 使用QPainter直接在上⾯进行绘制图形.
  • 通过文件路径加载并显示图⽚.
  • 能够针对图片进行像素级别的操作(操作某个指定的像素).
  • 独立于硬件的绘制系统,能够在不同系统之上提供⼀致的显示.

代码示例:QImage作为绘图设备的使用


 

5.3 QPicture

QPicture 核心特性:

  • 使用QPainter直接在上面进行绘制图形.
  • 通过文件路径加载并显示图片.
  • 能够记录QPainter的操作步骤.
  • 独力于硬件的绘制系统,能够在不同系统之上提供⼀致的显示

注意: QPicture 加载的必须是自身的存档⽂件,而不能是任意的png,jpg等图片文件.

QPicture类似于很多游戏的Replay功能.

例如像war3这样的经典游戏,即使是⼀场60分钟的膀胱局,生成的replay文件,也不过几百个KB.

此处的Replay功能并非是把整个游戏画面都录制保存下来,而是记录了地图中发生的所有事 件(地图元素,玩家单位操作,中立生物行为等...). 

当回放Replay的时候其实就是把上述记录的事件再⼀条⼀条的执行⼀遍即可还原之前的游戏 场景了.

如果要记录下QPainter的命令,⾸先要使⽤QPainter::begin()函数,将QPicture实例作为参数传递 进去,以便告诉系统开始记录,记录完毕后使用QPainter::end()命令终⽌。如下示例:

实现效果:

通过QPicture重现绘图指令后,实现的效果如下:

 

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

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

相关文章

Linux 手动安装Ollama

Linux 离线安装Ollama 前言 不知道为什么 在阿里云服务器上 执行curl -fsSL https://ollama.com/install.sh | sh一键安装 非常慢 所以只能手动装了 1.到 https://ollama.com/install.sh 下载安装执行文件 修改其中 下载和安装部分代码 if curl -I --silent --fail --location…

Python数据分析-Numpy快速入门

一、什么是Numpy 二、 创建 Numpy ndarray对象 三、数组中的维度 1.各种维度数组 2.检查维度数 3.创建更高维度的数组 四、数组索引 1.访问数组元素 2.访问2-D数组元素 其他维度的同理 3.负索引 五、数据裁剪:要头不要尾 1.裁剪数组 demo: 2.负裁…

构建基于 Feign 的微服务:从 Eureka 到负载均衡的实践 --day05

目录 步骤1:创建父工程feign-1步骤2:改造服务提供者使用 RequestMapping使用 GetMapping 步骤3:改造服务消费者为Feign客户端(1)添加Feign依赖(2)添加EnableFeignClients注解(3&…

YoloV10 训练自己的数据集(推理,转化,C#部署)

目录 一、下载 三、开始训练 train.py detect.py export.py 超参数都在这个路径下 四、C#读取yolov10模型进行部署推理 如下程序是用来配置openvino 配置好引用后就可以生成dll了 再创建一个控件,作为显示 net framework 4.8版本的 再nuget工具箱里下载 …

thinkphp6开发的通用网站系统源码

thinkphp6开发的通用网站系统源码。 基于ThinkPHP6框架开发的通用后台权限管理系统,底层采用国内最流行的ThinkPHP6框架, 支持内容管理、文章管理、用户管理、权限管理、角色管理等功能。 代码下载

Cookie和Session的对比

Cookie和Sesion 一、cookie和session创建对象 2024/9/15 10:23:59 你想了解的是如何在某种编程语言中创建和管理 cookies 和 sessions 吗?如果是的话,具体是哪个语言或框架呢? 2024/9/15 10:24:09 二、创建对象是客户端还是服务器 2024/…

20Kg载重30分钟续航多旋翼无人机技术详解

一、机架与结构设计 1. 材料选择:为了确保无人机能够承载20Kg的负载,同时实现30分钟的续航,其机架材料需选用轻质高强度的材料,如碳纤维或铝合金。这些材料不仅具有良好的承重能力,还能有效减轻无人机的整体重量&…

一步一步搭建AI智能体应用

您可以在百炼控制台以零代码的方式快速创建智能体应用,并将RAG(Retrieval-Augmented Generation,检索增强生成)以及插件能力集成进来。应用创建完成后,您可以通过控制台或API的方式来使用。 以下均以 大模型应用指代 智…

微信小程序使用 ==== 粘性布局

目录 Chrome杀了个回马枪 position:sticky简介 你可能不知道的position:sticky 深入理解粘性定位的计算规则 粘性定位其他特征 代码实现 微信小程序在scroll-view中使用sticky Chrome杀了个回马枪 position:sticky早有耳闻也有所了解,后来,Chro…

通过API接口获取下来的数据需要怎样应用?

在当今数字化时代,通过API接口获取数据已成为企业获取、处理和分析信息的重要手段。API接口不仅能够提高数据交互的效率,还能促进数据的安全性和灵活性。以下是如何将通过API接口获取的数据有效应用的一些方法和策略。 数据整合与分析 企业可以通过API接…

QPS和TPS的区别简单理解

QPS(Queries Per Second) QPS是指每秒查询率,它是衡量服务器处理能力的一个指标,表示服务器在一秒钟内能够响应的查询次数。这个指标通常用于数据库或服务器的性能测试,反映了服务器在规定时间内处理流量的能力。QPS …

浮动元素详解

浮动元素 代码实现&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>浮动元素</title><style>#container1 {width: 400px;height: 50px;background-color: lightgrey;border: 1px solid;}#contai…

世界杯足球赛网站---附源码73185

摘 要 随着互联网的普及和足球运动的全球性影响力&#xff0c;建立一个专门的世界杯足球赛网站成为了与球迷互动和传播赛事信息的重要途径。本论文聚焦于世界杯足球赛网站的设计与实现&#xff0c;旨在探讨如何利用现代技术为球迷提供一个全方位的足球赛事体验。 通过对 Spring…

上传头像,访问本地图片

文件大坑&#xff1a; web项目&#xff1a;首先不能直接访问本地资源&#xff0c;只能够访问服务器上的资源。 所以我想就储存数据到服务器&#xff0c;但是这样有个问题就是&#xff0c;当重新启动程序时&#xff0c;服务器上的所有文件会被重新编译&#xff0c;导致之前的文…

HarmonyOS开发实战( Beta5.0)自动生成动态路由实践

鸿蒙HarmonyOS开发往期必看&#xff1a; HarmonyOS NEXT应用开发性能实践总结 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; 介绍 本示例将介绍如何使用装饰器和插件&#xff0c;自动生成动…

【UE5】使用2DFlipbook图作为体积纹理,实现实时绘制体积纹理

这是一篇对“Creating a Volumetric Ray Marcher-Shader Bits”的学习心得 文章时间很早&#xff0c;因此这里针对UE5对原文做出兼容性修正&#xff08;为避免累赘不做出注明。链接如上&#xff0c;有需要自行学习&#xff09; 以及最后对Custom做可能的蓝图移植&#xff0c;做…

Qt中样式表常用的属性名称定义

Qt中&#xff0c;用好样式表&#xff0c;不但可以做出意想不到的酷炫效果&#xff0c;有时候也能减轻开发量&#xff0c;可能由于你不了解某些样式使用&#xff0c;想破脑袋通过代码实现的效果&#xff0c;反倒不如别人用样式&#xff0c;一两句样式脚本就搞定。 Qt中&#xff…

第T8周:猫狗识别

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 ●难度&#xff1a;夯实基础⭐⭐ ●语言&#xff1a;Python3、TensorFlow2 要求&#xff1a; 1.了解model.train_on_batch()并运用 2.了解tqdm&#xff0c;并使用tqdm实现可视化进度条 拔高&#xff08…

Day11-K8S日志收集及搭建高可用的kubernetes集群实战案例

Day11-K8S日志收集及搭建高可用的kubernetes集群实战案例 0、昨日内容回顾1、日志收集1.1 K8S日志收集项目之架构图解三种方案1.2 部署ES1.3 部署kibana1.4 部署filebeat 2、监控系统2.1 部署prometheus 3、K8S二进制部署3.1 K8S二进制部署准备环境3.2 基础组件安装3.3 生成K8S…

OpenCV-Python笔记(上)

安装 全局安装 pip install opencv-python项目虚拟环境安装 # 进入项目根路径执行 .venv/bin/pip install opencv-python计算机眼中的图像 一张图片由大小比如&#xff08;100*100&#xff09;决定&#xff0c;说明存在100*100的像素点&#xff0c;每个像素点存在颜色通道&…