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.mzph.cn/news/36632.shtml

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

相关文章

chatserver服务器开发笔记

chatserver服务器开发笔记 1 chatserver2 开发环境3 编译 1 chatserver 集群聊天服务器和客户端代码,基于muduo、redis、mysql实现。 学习于https://fixbug.ke.qq.com/ 本人已经挂github:https://github.com/ZixinChen-S/chatserver/tree/main 需要该项…

kubernetes pod 资源限制 探针

资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时,代表容器运行所需的最小资源量,调度器就使用该信息来决定将 Pod …

Java课题笔记~ JSP开发模型

MVC 1.JSP演化历史 1. 早期只有servlet,只能使用response输出标签数据,非常麻烦 2. 后来有了jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,有写html表,造成难于维护&…

计算机网络实验4:HTTP、DNS协议分析

文章目录 1. 主要教学内容2. HTTP协议3. HTTP分析实验【实验目的】【实验原理】【实验内容】【实验思考】 4. HTTP分析实验可能遇到的问题4.1 捕捉不到http报文4.2 百度是使用HTTPS协议进行传输4.3 Wireshark获得数据太多如何筛选4.4 http报文字段含义不清楚General&#xff08…

Git和GitHub

文章目录 1.Git介绍2. 常用命令3. Git分支操作4. Git团队协作机制5. GitHub操作6. IDEA集成Git7.IDEA操作GitHub8. Gitee 1.Git介绍 Git免费的开源的分布式版本控制系统,可以快速高效从小到大的各种项目 Git易于学习,占地面积小,性能快。它…

【日常积累】RPM包依赖下载及私有yum仓库搭建

概述 某些时候,我们需要下载某个RPM包依赖的依赖。如某些内网环境,就需要自行准备rpm包。可以通过能上互联网的服务器进行相应的rpm包下载,然后在拷贝到相应的服务器安装,或者搭建自己的内容rpm包仓库。 查看*.rpm 包依赖&#…

Flink多流处理之Broadcast(广播变量)

写过Spark批处理的应该都知道,有一个广播变量broadcast这样的一个算子,可以优化我们计算的过程,有效的提高效率;同样在Flink中也有broadcast,简单来说和Spark中的类似,但是有所区别,首先Spark中的broadcast是静态的数据,而Flink中的broadcast是动态的,也就是源源不断的数据流.在…

什么是微服务?

2.微服务的优缺点 优点 单一职责原则每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求;开发简单,开发效率提高,一个服务可能就是专一的只干一件事;微服务能够被小…

命令提示符之操作基础(Windows)

打开命令提示符 方法一 打开指定文件的文件夹,在路径栏里输入“cmd”,回车,就进入控制台了。默认路径就是指定文件夹的路径。 方法二 打开指定的文件夹,按住shift键,在空白处右击,在菜单栏中选择“在此处打…

社区团购商城拼团秒杀接龙分销团长小程序开源版开发

社区团购商城拼团秒杀接龙分销团长小程序开源版开发 功能介绍: 商品管理:增加商品-商品列表-商品分类-商品单/多规格-商品标签 订单管理:订单列表-订单挑选-订单导出-订单打印-批量发货-商品评价 会员管理:会员列表-会员挑选-会员…

【Git】—— 标签管理

目录 (一)理解标签 1、作用 (二)创建标签 (三)操作标签 1、删除标签 2、推送标签 3、删除远程标签 (一)理解标签 标签 tag ,可以简单的理解为是对某次 commit 的…

python中的迭代器和生成器

一、迭代器 支持迭代的容器,如列表(list)、元组(tuple)、字典(dict)、集合(set)这些序列式容器。 自定义迭代器的类中必须实现以下2个方法: __next__(self)…

监控Kubernetes 控制面组件的关键指标

控制面组件的监控,包括 APIServer、Controller-manager(简称 CM)、Scheduler、etcd 四个组件。 1、APIServer APIServer 的核心职能是 Kubernetes 集群的 API 总入口,Kube-Proxy、Kubelet、Controller-Manager、Scheduler 等都需…

TCP 协议十大相关特性总结

目录 一、TCP特性 二、报文格式 TCP十大核心特性 1. 确认应答 2. 超时重传 3. 连接管理(三次握手,四次挥手) 三次握手 四次挥手 4. 滑动窗口 情况一:接收方的ACK丢失 情况二:发送方的数据包丢失 5. 流量控制 6. 拥塞控制 7. 延迟应答 8. 捎带应答 9. 字节流粘包问题 10. TCP的…

大语言模型:LLM的概念是个啥?

一、说明 大语言模型(维基:LLM- large language model)是以大尺寸为特征的语言模型。它们的规模是由人工智能加速器实现的,人工智能加速器能够处理大量文本数据,这些数据大部分是从互联网上抓取的。 [1]所构建的人工神…

02 - git 文件重命名

查看所有文章链接:(更新中)GIT常用场景- 目录 文章目录 1. 第一种方式2. 第二种方式 1. 第一种方式 mv kongfu_person.txt kongfu.txt git add .2. 第二种方式 git mv kongfu_person.txt kongfu.txt

微服务实战项目-学成在线-项目优化(redis缓存优化)

微服务实战项目-学成在线-项目优化(redis缓存优化) 1 优化需求 视频播放页面用户未登录也可以访问,当用户观看试学课程时需要请求服务端查询数据,接口如下: 1、根据课程id查询课程信息。 2、根据文件id查询视频信息。 这些接口在用户未认…

MySQL表的增删查改

目录 一,新增 二,查询 2.1 全列查询 2.2 指定列查询 2.3 查询字段为表达式 2.4 别名 - as 2.5 去重 - distinct 2.6 排序 - order by 2.7 条件查询 - where 2.8 分页查询 - limit 三,修改 - update 四,删除 - delete 一…

Spring-2-透彻理解Spring 注解方式创建Bean--IOC

今日目标 学习使用XML配置第三方Bean 掌握纯注解开发定义Bean对象 掌握纯注解开发IOC模式 1. 第三方资源配置管理 说明:以管理DataSource连接池对象为例讲解第三方资源配置管理 1.1 XML管理Druid连接池(第三方Bean)对象【重点】 数据库准备 -- 创建数据库 create …

纯前端 -- html转pdf插件总结

一、html2canvasjsPDF(文字会被截断): 将HTML元素呈现给添加到PDF中的画布对象,不能仅使用jsPDF,需要html2canvas或rasterizeHTML html2canvasjsPDF的具体使用链接 二、html2pdf(内容显示不全文字会被截断…