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

文章目录

  • 前言
  • 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.rhkb.cn/news/86169.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聚观早报 | 三星和LG发展电车零件业务;宝马召回国产和进口电车

【聚观365】8月12日消息 三星和LG加速发展电车零件业务宝马召回部分国产和进口电动汽车华为有意推动车BU独立运营长城汽车CTO就“中国汽车在一起”发声比科奇芯片被Contela选为单元的核心组件 三星和LG加速发展电车零件业务 随着电动汽车需求的增加,对电池、芯片等…

新一代分布式融合存储,数据场景All In One

1、摘要 2023年5月11日,浪潮信息全国巡展广州站正式启航。会上,重磅发布新一代分布式融合存储AS13000G7,其采用极致融合架构设计理念,实现同一套存储满足四种非结构化数据的“All In One”高效融合,数据存力提升300%&a…

28.Netty源码之缓存一致性协议

Mpsc Queue 基础知识 Mpsc 的全称是 Multi Producer Single Consumer,多生产者单消费者。Mpsc Queue 可以保证多个生产者同时访问队列是线程安全的,而且同一时刻只允许一个消费者从队列中读取数据。 Netty Reactor 线程中任务队列 taskQueue 必须满足多个…

pycharm离线安装依赖包

一、对于单个下载离线包,然后安装 1、先去https://pypi.org/网站下载离线包,下载到本地; 2、从磁盘中找到刚刚下载包,点击确定就可以安装了 二、将本地项目所有依赖包全部下载下来,然后批量在另一个项目&#xff…

造个破谣而已,咋还用上AI了?

最近,央视等各大媒体纷纷曝光了全国多起用AI炮制网络谣言的案例,其中涉及灾害、安全事故、刑事案件等多类谣言内容,造谣的方式更是从文案到图片、视频不一而足。 看到这样的消息,总是会加重我们对AI的担忧,联想到此前的…

windows使用/服务(13)戴尔电脑怎么设置通电自动开机

戴尔pc机器通电自启动 1、将主机显示器键盘鼠标连接好后,按主机电源键开机 2、在开机过程中按键盘"F12",进入如下界面,选择“BIOS SETUP” 3、选择“Power Management” 4、选择“AC Recovery”,点选“Power On”,点击“…

C语言每日一题:16:数对。

思路一&#xff1a;基本思路 1.x,y均不大于n&#xff0c;就是小于等于n。 2.x%y大于等于k。 3.一般的思路使用双for循环去遍历每一对数。 代码实现&#xff1a; #include <stdio.h> int main() {int n 0;int k 0;//输入scanf("%d%d", &n, &k);int x…

springboot第35集:微服务与flutter安卓App开发

Google Playplay.google.com/apps/publis…[1]应用宝open.qq.com/[2]百度手机助手app.baidu.com/[3]360 手机助手dev.360.cn/[4]vivo 应用商店dev.vivo.com.cn/[5]OPPO 软件商店&#xff08;一加&#xff09;open.oppomobile.com/[6]小米应用商店dev.mi.com/[7]华为应用市场dev…

Pycharm解决启动时候索引慢的问题

设置里去掉update里面的两个勾 shared indexes中&#xff0c;把自动下载索引改成不下载使用本地索引

综合能源系统(6)——综合能源综合评估技术

综合能源系统关键技术与典型案例  何泽家&#xff0c;李德智主编 综合能源系统是多种能源系统非线性耦合的、多时间与空间尺度耦合的“源-网-荷一储”一体化系统&#xff0c;通过能源耦合、多能互补&#xff0c;能够实现能源的高效利用&#xff0c;并提高新能源的利用水平。对…

沁恒ch32V208处理器开发(三)GPIO控制

目录 GPIO功能概述 CH32V2x 微控制器的GPIO 口可以配置成多种输入或输出模式&#xff0c;内置可关闭的上拉或下拉电阻&#xff0c;可以配置成推挽或开漏功能。GPIO 口还可以复用成其他功能。端口的每个引脚都可以配置成以下的多种模式之一&#xff1a; 1 浮空输入 2 上拉输入…

安装使用IDEA,修改样式,配置服务,构建Maven项目(超级详细版)

目录 前言&#xff1a; 一&#xff0c;安装 1.1打开官网JetBrains: Essential tools for software developers and teams点击 Developer Tools&#xff0c;再点击 Intellij IDEA 2.点击下载​编辑 3.选择对应的版本&#xff0c;左边的 Ultimate 版本为旗舰版&#xff0c;需要…

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用

qModMaster工具介绍 QModMaster是一个基于Qt的Modbus主站&#xff08;Master&#xff09;模拟器&#xff0c;用于模拟和测试Modbus TCP和RTU通信。它提供了一个直观的图形界面&#xff0c;使用户能够轻松设置和发送Modbus请求&#xff0c;并查看和分析响应数据。 以下是QModM…

图像处理技巧形态学滤波之腐蚀操作

1. 引言 欢迎回来&#xff0c;我的图像处理爱好者们&#xff01;今天&#xff0c;让我们深入研究图像处理领域中的形态学计算。这些非线性的图像处理技术允许我们操纵图像中对象的形状和结构。在本系列中&#xff0c;我们将依次介绍四种基本的形态学操作&#xff1a;腐蚀、膨胀…

Kafka 概述

Kafka 为什么需要消息队列&#xff08;MQ&#xff09;使用消息队列的好处&#xff08;1&#xff09;解耦&#xff08;2&#xff09;可恢复性&#xff08;3&#xff09;缓冲&#xff08;4&#xff09;灵活性 & 峰值处理能力&#xff08;5&#xff09;异步通信 消息队列的两…

Neo4j笔记-数据迁移(导出/导入)

这里先说明以下几点&#xff1a; Neo4j在4.0下版本默认的库名是&#xff1a;graph.db Neo4j在4.0上版本默认的库名是&#xff1a;neo4j.db 不管是Neo4j&#xff0c;还是Neo4j Desktop&#xff0c;都会在bin目录下有neo4j、neo4j-admin软件。在conf目录下&#xff0c;有neo4j.…

MySQL SUBSTRING_INDEX() 函数的详细介绍

MySQL SUBSTRING_INDEX() 从给定字符串中返回指定数量的分隔符出现之前的子字符串。 当指定数字为正数时从最终分隔符的左侧返回子字符串&#xff0c;当指定数字为负数时从最终分隔符的右侧返回子字符串。 如果指定的次数大于分隔符的出现次数&#xff0c;则返回的子字符串将…

【每日一题】1572. 矩阵对角线元素的和

【每日一题】1572. 矩阵对角线元素的和 1572. 矩阵对角线元素的和题目描述解题思路 1572. 矩阵对角线元素的和 题目描述 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&a…

pycharm的Terminal中如何设置打开anaconda3的虚拟环境

在pycharm的File -> Settings -> Tools -> Terminal下面&#xff0c;如下图所示 修改为红框中内容&#xff0c;然后关闭终端在重新打开终端&#xff0c;即可看到anaconda3的虚拟环境就已经会被更新

数学建模(一)前继概念

课程推荐&#xff1a;数学建模老哥_哔哩哔哩_bilibili 目录 一、什么是数学建模&#xff1f; 二、数学建模的一般步骤 三、数学建模赛题类型 1.预测型 2. 评价类 3.机理分析类 4. 优化类 一、什么是数学建模&#xff1f; 数学建模是利用数学方法解决实际问题的一种实践。…