08-1_Qt 5.9 C++开发指南_QPainter绘图

news2024/11/24 5:47:23

文章目录

  • 前言
  • 1. QPainter 绘图系统
    • 1.1 QPainter 与QPaintDevice
    • 1.2 paintEvent事件和绘图区
    • 1.3 QPainter 绘图的主要属性
  • 2. QPen的主要功能
  • 3. QBrush的主要功能
  • 4. 渐变填充
  • 5. QPainter 绘制基本图形元件
    • 5.1 基本图像元件
    • 5.2 QpainterPath的使用

前言

本章所介绍内容基本在《QT从入门到实战x篇》中对应有介绍,本专栏主要做简要功能介绍,到实际需要使用的时候再做详究。

1. QPainter 绘图系统

1.1 QPainter 与QPaintDevice

Qt 的绘图系统使用户可以在屏幕或打印设备上用相同的 API绘图,绘图系统基于 QPainter、QPaintDevice和QPaintEngine 类。

QPainter 是用来进行绘图操作的类,QPaintDevice 是一个可以使用QPainter 进行绘图的抽象的二维界面,QPaintEngine 给 QPainter 提供在不同设备上绘图的接口。QPaintEngine 类由 QPainter 和QPaintDevice 内部使用,应用程序一般无需和 QPaintEngine 打交道,除非要创建自己的设备类型。

一般的绘图设备包括 QWidget、QPixmap、QImage 等,这些绘图设备为 QPainter 提供一个“画布”。

1.2 paintEvent事件和绘图区

QWidget 类及其子类是最常用的绘图设备,从QWidget 类继承的类都有 paintEvent()事件,要在设备上绘图,只需重定义此事件并编写响应代码。创建一个 QPainter 对象获取绘图设备的接口,然后就可以在绘图设备的“画布”上绘图了。
在paintEvent()事件里绘图的基本程序结构是:

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter    painter(this);//创建与绘图设备关联的QPainter对象
    ```//painter在设备的窗口上画图
}

首先创建一个属于本绘图设备的 QPainter 对象 painter,然后使用这个 painter 在绘图设备的窗口上画图。

在这里插入图片描述

QWidget 的绘图区就是其窗口内部区域。如图8-1所示是在一个 QWidget 窗口上绘制了一个填充矩形(这个实心矩形及其边框是程序绘制的图形,其他直线和文字是为说明而加的),整个窗口内部的矩形区就是QPainter 可以绘图的区域。

QWidget的内部绘图区的坐标系统如图8-1所示,坐标系统的单位是像素。左上角坐标为(0,0),向右是X 轴正方向,向下是 Y 轴正方向,绘图区的宽度由QWidget::width()函数获取,高度由 QWidget::height()函数获取,所以,绘图区右下角的的点的坐标是(width(),height())。这个坐标系统是 QWidget 绘图区的局部物理坐标,称为视口(viewport)坐标。相应的还有逻辑坐标,称为窗口 (window)坐标,后面再详细介绍。

使用QPainter 在QWidget 上绘图就是在这样的一个矩形区域里绘图

1.3 QPainter 绘图的主要属性

用 QPainter 在绘图设备上绘图,主要是绘制一些基本的图形元素,包括点、直线、圆形、矩形、曲线、文字等,控制这些绘图元素特性的主要是 QPainter 的 3 个属性,分别如下。

  • pen 属性:是一个 QPen 对象,用于控制线条的颜色、宽度、线型等,如图 8-1 所示矩形边框的线条的特性就是由 pen 属性决定的。

  • brush 属性:是一个QBrush 对象,用于设置一个区域的填充特性,可以设置填充颜色、填充方式、渐变特性等,还可以采用图片做材质填充。图 8-1 中的矩形用黄色填充就是由 brush属性设置决定的。

  • font 属性:是一个 QFont 对象,用于绘制文字时,设置文字的字体样式、大小等属性。

使用这 3 个属性基本就控制了绘图的基本特点,当然还有一些其他的功能结合使用,比如叠加模式、旋转和缩放等功能。

关于QPainter基本功能实例,请参考书籍。

2. QPen的主要功能

QPen 用于绘图时对线条进行设置,主要包括线宽、颜色、线型等,表 8-1是 QPen 类的主要接口函数。通常一个设置函数都有一个对应的读取函数,例如 setColor()用于设置画笔颜色,对应的读取画笔颜色的函数为 color(),表 8-1 仅列出设置函数(省略了函数参数中的 const 关键字)。

在这里插入图片描述

线条颜色和宽度的设置无需多说,,QPen影响线条特性的另外3 个主要属性是线条样式(style).
端点样式(capStyle) 和连接样式 (joinStyle)。具体如何影响见书籍。

3. QBrush的主要功能

QBrush 定义了QPainter 绘图时的填充特性,包括填充颜色、填充样式、材质填充时的材质图片等,其主要函数见表 8-2(省略了函数参数中的 const 关键字)。

在这里插入图片描述

setStyle(Qt::BrushStyle style)函数设置画刷的样式,参数是 Qt:BrushStyle style 枚举类型,该枚举类型典型的几种取值见表 8-3,详细的取值请参考Qt 的帮助文件。

在这里插入图片描述

4. 渐变填充

使用渐变填充需要用渐变类的对象作为 Painter 的 brush,有3 个实现渐变填充的类。

QLinearGradient:线性渐变。指定一个起点及其颜色,终点及其颜色,还可以指定中间的某个点的颜色,起点至终点之间的颜色会线性插值计算,得到线性渐变的填充颜色。

QRadialGradient:有简单辐射渐变和扩展辐射渐变两种方式。简单辐射渐变是在一个圆内的一个焦点和一个端点之间生成渐变颜色,扩展辐射渐变是在一个焦点圆和一个中心圆之间生成渐变色。
QConicalGradient:圆锥形渐变,围绕一个中心点逆时针生成渐变颜色。

具体使用见书籍

5. QPainter 绘制基本图形元件

5.1 基本图像元件

QPainter 提供了很多绘制基本图形的功能,包括点、直线、椭圆、矩形、曲线等,由这些基本的图形可以构成复杂的图形。QPainter 中提供的绘制基本图元的函数见对应章节。每个函数基本上都有多种参数形式,这里只列出函数名,给出了其中一种参数形式的示例代码,并且假设已经通过以下的代码获得了绘图窗口的 painter、窗口宽度W和高度H。

QPainter painter(this);
int W=this->width); //绘图区宽度
int H=this->height); //绘图区高度

同一个函数名的其他参数形式的函数原型可查阅 Qt 的帮助文件。

5.2 QpainterPath的使用

QPainterPath 是一系列绘图操作的顺序集合,便于重复使用。一个 PainterPath 由许多基本的绘图操作组成,如绘图点移动、划线、画圆、画矩形等,一个闭合的 PainterPath 是终点和起点连接起来的绘图路径。使用QPainterPath 的优点是绘制某些复杂形状时只需创建一个PainterPath,然后调用 QPainter:drawPath()就可以重复使用。例如绘制一个复杂的星星图案需要多次调用 lineto()函数,定义一个QPainterPath 类型的变量 path 记录这些绘制过程,再调用drawPath(path)就可以完成星型图案的绘制。具体见参考书籍。

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

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

相关文章

python编辑器安装与配置,python用哪个编辑器好用

大家好,给大家分享一下python编辑器pycharm安装教程,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 哪些python的编程软件值得推荐? 编写python源代码的软件.首推的Pycharm。 PyCharm用于bai一般IDE具备的功能&…

Kotlin Executors线程池newSingleThreadExecutor单线程

Kotlin Executors线程池newSingleThreadExecutor单线程 import java.util.concurrent.Executorsfun main() {val mExecutorService Executors.newSingleThreadExecutor()for (i in 1..5) {mExecutorService.execute {println("seq-$i tid:${Thread.currentThread().threa…

CSS3 中新增了哪些常见的特性?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 圆角(Border Radius)⭐ 渐变(Gradients)⭐ 阴影(Box Shadow)⭐ 文本阴影(Text Shadow)⭐ 透明度(Opacity)⭐ 过渡&…

在跨境电子商务客户支持中使用AI的几种方法

OpenAI,ChatGPT等,AI正在快速发展。今天的人工智能比以往任何时候都更智能、更细致、更准确。高性能的客户支持团队为任何电子商务业务提供了许多好处。这些优势包括更高的销售额、更好的保留率、更高的忠诚度和信任度、更高的认知度和品牌知名度、更好的…

【网络】传输层——UDP | TCP(协议格式确认应答超时重传连接管理)

🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 现在是传输层,在应用层中的报文(报头 有效载荷)就不能被叫做报文了,而是叫做数…

通过OpenTelemetry上报Python-flask应用数据(阿里云)

参考文档 https://help.aliyun.com/document_detail/611711.html?spma2c4g.90499.0.0.34a056ddTu2WWq 先按照 方法一:手动埋点上报Python应用数据 步骤测试上报是否正常。 flas 上报 在 手动埋点上报Python应用数据 的基础上,上报flask应用的数据&#…

Jmeter快捷方式和应用图标设置

很多人在安装Jmeter,安装到本机却没有icon,每次使用的时候,每次打开应用都要找目录,不太方便。 【解决问题】 使用bin路径下的一个.bat文件,创建快捷方式。 【操作步骤】 Step1、将Jmeter 安装bin路径下的jmeter.bat 发送快捷方…

【论文阅读】基于深度学习的时序预测——Crossformer

系列文章链接 论文一:2020 Informer:长时序数据预测 论文二:2021 Autoformer:长序列数据预测 论文三:2022 FEDformer:长序列数据预测 论文四:2022 Non-Stationary Transformers:非平…

【后端面经-数据库】Redis详解——Redis基本概念和特点

【后端面经-数据库】Redis详解——Redis基本概念和特点 1. Redis基本概念2. Redis特点2.1 优点2.2 缺点 3. Redis的应用场景面试模拟参考资料 声明:Redis的相关知识是面试的一大热门知识点,同时也是一个庞大的体系,所涉及的知识点非常多&…

日常BUG——Java使用Bigdecimal类型报错

😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 直接上代码: Test public void test22() throws ParseException {System.out.p…

Golang通过alibabaCanal订阅MySQLbinlog

最近在做redis和MySQL的缓存一致性,一个方式是订阅MySQL的BinLog文件,我们使用阿里巴巴的Canal的中间件来做。 Canal是服务端和客户端两部分构成,我们需要先启动Canal的服务端,然后在Go程序里面连接Canal服务端,即可监…

初始C语言——详细讲解操作符以及操作符的易错点

系列文章目录 第一章 “C“浒传——初识C语言(更适合初学者体质哦!) 第二章 详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言——特别详细地介绍函数 第四章 初始C语言——详细地讲解数组的内容以及易错点 第五章 初始C语言—…

Docker 安装和架构说明

Docker 并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。 Docker实质上是在已经运行的Liunx下制造了一个隔离的文件环境,因此他的执行效率几乎等同于所部署的linux主机。因此Docker必须部署在Linux内核系统上。如果其他系统想部署Docke…

CAD练习——绘制电风扇

注意要在三维空间内完成绘制 先绘制扇叶 两条射线确定角度 绘制圆弧(圆修剪) 绘制扇叶形状(3点圆弧) 圆角: 将这几段圆弧合成同一条多段线 换个立体视图 拉伸出厚度 绘制一个球 取二者交集(带弧面的扇叶&a…

快速使用公网远程访问内网群晖NAS 7.X版 【内网穿透】

公网远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 公网远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 在群晖控制面板找到“终端机和SNMP”2. 建立一条连接公网数据隧道3. 获取公网访问内网群晖NAS的数据隧道入口 前言 群晖NAS作为应用较为广泛的小型数据存储中心&#…

【工程优化问题】基于鲸鱼、萤火虫、灰狼优化算法的张力、压缩弹簧设计问题研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

第六章 SpringBoot注解 @ConditionalOnBean

满足条件的则进行组件的注入 Configuration(proxyBeanMethods true) //告诉SpringBoot这是一个配置类 配置文件 ConditionalOnBean(name "tom") public class MyConfig {Bean("tom")public Pet tom(){return new Pet("tomPet");}/*** 外部无论…

短视频账号矩阵系统/技术开发搭建私有部署

本系统是基于短视频领域的新一代系统,旨在提供一个高效、全面的短视频管理与分发平台。系统采用先进的开发算法和技术,实现了智能化视频分类、推荐和用户互动功能。 目录 一、抖音SEO账号矩阵系统的开发和部署遵循以下原则: 二、账号矩阵绑…

AI:03-基于深度神经网络的低空无人机目标检测图像识别的研究

文章目录 数据集收集与预处理深度神经网络模型设计模型训练与优化目标检测与图像识别代码实现:实验结果与分析讨论与展望低空无人机的广泛应用为许多领域带来了巨大的潜力和机会。为了实现无人机的自主导航和任务执行,准确的目标检测和图像识别是至关重要的。本文旨在研究并提…

Win10安装GPU支持的最新版本的tensorflow

我在安装好cuda和cudnn后,使用pip install tensorflow安装的tensorflow都提示不能找到GPU, 为此怀疑默认暗转的tensorflow是不带GPU支持的。 在tensorflow官网提供了多个版本的GPU支持的windows的安装包 https://www.tensorflow.org/install/pip?hlz…