【Qt开发流程】之2D绘图1:概述及基本绘制与填充和渐变填充

概述

Qt的绘图系统可以使用相同的API在屏幕和打印设备上进行绘图,并且主要基于QPainter, QPaintDeviceQPaintEngine类。
QPainter用于执行绘图操作,QPaintDevice是一个二维空间的抽象,可以使用QPainter在其上绘制,QPaintEngine提供了QPainter用于在不同类型的设备上绘制的接口。QPaintEngine类在QPainterQPaintDevice内部使用,并且对应用程序程序员是隐藏的,除非他们创建自己的设备类型。

这种方法的主要好处是,所有的绘制都遵循相同的绘制方式,从而很容易添加对新特性的支持,并为不支持的特性提供默认实现。

以下类为QPainter绘制提供了支持:

描述
QBitmap单色(1位深度)像素图
QBrush定义由QPainter绘制的形状的填充模式
QColor基于RGB, HSV或CMYK值的颜色
QColormap将与设备无关的QColors映射到与设备相关的像素值
QConicalGradient与QBrush结合使用,指定锥形梯度刷
QFont指定用于绘制文本的字体
QFontMetrics字体度量信息
QFontMetricsF字体度量信息
QGenericMatrix模板类,表示有N列和M行的NxM变换矩阵
QGradient与QBrush结合使用来指定渐变填充
QIcon不同模式和状态下的可伸缩图标
QIconEngineQIcon渲染器的抽象基类
QImage独立于硬件的图像表示,允许直接访问像素数据,并且可以用作绘画设备
QImageReader格式独立的接口,读取图像从文件或其他设备
QImageWriter用于将图像写入文件或其他设备的格式独立接口
QLine二维矢量采用整数精度
QLineF二维矢量使用浮点精度
QLinearGradient与QBrush结合使用,指定线性梯度刷
QMargins定义矩形的四个边距
QMarginsF定义矩形的四个边距
QPagedPaintDevice表示支持多个页面的绘图设备
QPaintDevice可以用QPainter绘制的对象的基类
QPaintEngineQPainter如何在给定平台上绘制给定设备的抽象定义
QPainter在小部件和其他绘制设备上执行低级绘制
QPainterPath用于绘制操作的容器,使图形形状能够被构造和重用
QPainterPathStroker用于为给定的画家路径生成可填充的轮廓
QPdfWriter类生成可用作绘图设备的pdf
QPen定义QPainter应该如何绘制形状的线条和轮廓
QPixmap可以用作绘画设备的屏幕外图像表示
QPlatformFontDatabase可以自定义字体的发现方式和呈现方式
QPoint使用整数精度在平面上定义一个点
QPointF使用浮点精度在平面上定义一个点
QPolygon向量点使用整数精度
QPolygonF向量点使用浮点精度
QRadialGradient与QBrush结合使用,指定径向梯度刷
QRect使用整数精度在平面上定义一个矩形
QRectF使用浮点精度在平面中定义一个矩形
QRegion指定绘图器的剪辑区域
QSize使用整数点精度定义二维对象的大小
QSizeF使用浮点精度定义二维对象的大小
QStylePainter用于在小部件内绘制QStyle元素的方便类
QSupportedWritingSystems在使用内部Qt字体数据库注册字体时使用
QSvgGenerator用于创建SVG绘图的绘图设备
QSvgRenderer用于将SVG文件的内容绘制到绘图设备上
QSvgWidget小部件,用于显示可缩放矢量图形(SVG)文件的内容
QTransform指定坐标系统的2D转换
QVector2D表示二维空间中的向量或顶点

创建绘画设备

QPaintDevice类是可以绘制对象的基类,也就是说,QPainter可以在任何QPaintDevice子类上绘制。QPaintDevice的绘图功能是由QWidgetQImageQPixmapQPictureQPrinterQOpenGLPaintDevice实现的。

Widget

QWidget类是Qt Widgets模块中用户界面元素的基类。它接收来自窗口系统的鼠标、键盘和其他事件,并在屏幕上描绘自己的表示。

Image

QImage类提供了一个独立于硬件的图像表示,它是为I/O和直接的像素访问和操作而设计和优化的。QImage支持多种图像格式,包括单色,8位,32位和alpha混合图像。
使用QImage作为绘图设备的一个优点是,它可以以与平台无关的方式保证任何绘图操作的像素准确性。另一个好处是,绘制可以在当前GUI线程之外的另一个线程中执行。

Pixmap

QPixmap类是一个屏幕外的图像表示,它被设计和优化为在屏幕上显示图像。与QImage不同,像素图中的像素数据是内部的,由底层窗口系统管理,即像素只能通过QPainter函数或将QPixmap转换为QImage来访问。
为了使用QPixmap优化绘图,Qt提供了QPixmapCache类,它可以用于存储生成昂贵的临时像素图,而不会使用超过缓存限制的存储空间。
Qt还提供了QBitmap便利类,继承了QPixmapQBitmap保证单色(1位深度)像素图,主要用于创建自定义QCursorQBrush对象,构造QRegion对象。

OpenGL绘制设备

如前所述,Qt提供了一些类,使在Qt应用程序中使用OpenGL变得很容易。例如,QOpenGLPaintDevice启用OpenGL API来Picture
QPicture类是一个记录和回放QPainter命令的绘图设备。图片以平台无关的格式将画工命令序列化到IO设备。QPicture也是独立于分辨率的,即一个QPicture可以显示在不同的设备上(例如svg, pdf, ps,打印机和屏幕),看起来是一样的。
Qt提供了QPicture::load()QPicture::save()函数以及用于加载和保存图片的流操作符。

Custom Backends

可以通过派生QPaintDevice类并重新实现虚拟QPaintDevice:: paintenengine()函数来实现对新后端的支持,以告诉QPainter应该使用哪个绘制引擎在这个特定的设备上绘制。要真正能够在设备上绘图,这个绘图引擎必须是从qpaintenengine类派生出来的自定义绘图引擎。

绘制

QPainter提供了高度优化的功能,以完成大多数绘图GUI程序所需的功能。它可以绘制从简单的图形基元(由QPoint, QLine, QRect, QRegion和QPolygon类表示)到复杂形状(如矢量路径)的一切。在Qt矢量路径是由QPainterPath类表示的。QPainterPath为绘制操作提供了一个容器,使图形形状能够被构造和重用。

QPainterPath

painter路径是由线条和曲线组成的对象。例如,矩形由直线组成,椭圆由曲线组成。
与普通绘图操作相比,绘制路径的主要优势在于,复杂的形状只需要创建一次;然后只需调用QPainter::drawPath()函数就可以多次绘制它们。
QPainterPath对象可用于填充、勾勒和裁剪。要为给定的painter路径生成可填充的轮廓,可以使用QPainterPathStroker类。
线条和轮廓是使用QPen类绘制的。pen由其样式(即线条类型)、宽度、笔刷、如何绘制端点(cap-style)以及如何绘制两条连接线之间的连接(join-style)来定义。pen的笔刷是一个QBrush对象,用来填充pen生成的笔画,也就是说,QBrush类定义了填充模式。
QPainter还可以绘制对齐的文本和像素图。
绘制文本时,使用QFont类指定字体。Qt将使用具有指定属性的字体,或者如果没有匹配的字体存在,Qt将使用最接近匹配的已安装字体。实际使用的字体属性可以使用QFontInfo类检索。此外,QFontMetrics类提供字体度量,QFontDatabase类提供有关底层窗口系统中可用字体的信息。
通常,QPainter在“自然”坐标系中绘制,但它能够使用QTransform类执行视图和世界坐标系转换。

反锯齿绘制

绘制时,像素渲染由QPainter::Antialiasing渲染提示控制。QPainter::RenderHint枚举用于指定QPainter的标志,这些标志可能被任何给定的引擎尊重,也可能不被尊重。
QPainter::Antialiasing值表示引擎应该尽可能地消除原语的边缘,即通过使用不同的颜色强度平滑边缘。

基本图形绘制、填充

绘制线

void MainWindow::paintEvent(QPaintEvent *event)
{QPainter p(this);p.drawLine(50, 50, 100, 150);
}

在这里插入图片描述
或者,创建时不指定绘制设备,在begin()函数中设置,end时结束绘制。

    QPainter p;p.begin(this);p.drawLine(50, 50, 100, 150);p.end();

绘制圆弧
绘制由给定矩形、startAngle和spanAngle定义的圆弧。
起始角和伸缩角必须以1/16度指定,即一个完整的圆等于5760(16 * 360)。角度的正值表示逆时针方向,负值表示顺时针方向。零度在3点钟方位。

    QPainter p;p.begin(this);QRectF rectangle(10.0, 20.0, 80.0, 60.0);int startAngle = 30 * 16;int spanAngle = 120 * 16;p.drawArc(rectangle, startAngle, spanAngle);p.end();

在这里插入图片描述
绘制弦
绘制由给定矩形、startAngle和spanAngle定义的弦。弦被当前的笔刷()填充。
起始角和伸缩角必须以1/16度指定,即一个完整的圆等于5760(16 * 360)。角度的正值表示逆时针方向,负值表示顺时针方向。零度在3点钟方位。

    QPainter p;p.begin(this);QRectF rectangle(10.0, 20.0, 80.0, 60.0);int startAngle = 30 * 16;int spanAngle = 120 * 16;p.drawChord(rectangle, startAngle, spanAngle);p.end();

在这里插入图片描述
绘制凸多边形

    QPainter p;p.begin(this);static const QPointF points[4] = {QPointF(40.0, 110.0),QPointF(50.0, 40.0),QPointF(110.0, 70.0),QPointF(120.0, 100.0)};p.drawConvexPolygon(points, 4);p.end();

在这里插入图片描述
绘制椭圆

    QPainter p;p.begin(this);QRectF rectangle(100.0, 50.0, 80.0, 60.0);p.drawEllipse(rectangle);p.end();

在这里插入图片描述
如果宽,高一样,就是圆。
绘制扇形

    QPainter p;p.begin(this);QRectF rectangle(100.0, 50.0, 160.0, 120.0);int startAngle = 30 * 16;int spanAngle = 120 * 16;p.drawPie(rectangle, startAngle, spanAngle);p.end();

在这里插入图片描述

填充

除此之外,还可以使用画笔及画刷进行绘制和填充
绘制多边形

    QPainter p;p.begin(this);QPen pen(QBrush(Qt::gray), 2, Qt::DashLine, Qt::FlatCap, Qt::RoundJoin);p.setPen(pen);p.setBrush(Qt::green);static const QPointF points[4] = {QPointF(40.0, 110.0),QPointF(50.0, 40.0),QPointF(110.0, 70.0),QPointF(120.0, 100.0)};p.drawPolygon(points, 4);p.end();

在这里插入图片描述
绘制圆角矩形

    QPainter p;p.begin(this);QPen pen(QBrush(Qt::black), 2, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin);p.setPen(pen);p.setBrush(Qt::lightGray);QRectF rectangle(10.0, 20.0, 80.0, 60.0);p.drawRoundedRect(rectangle, 20.0, 15.0);p.end();

在这里插入图片描述

渐变填充

使用画刷还可以进行渐变填充。
渐变有三种:

  • 线性渐变:QLinearGradient
  • 辐射渐变:QRadialGradient
  • 锥形渐变:QConicalGradient

在这里插入图片描述
绘制矩形

    QPainter p;p.begin(this);QPen pen(QBrush(Qt::black), 2, Qt::SolidLine, Qt::RoundCap, Qt::BevelJoin);p.setPen(pen);QLinearGradient linearGrad(QPointF(100, 100), QPointF(200, 200));linearGrad.setColorAt(0, Qt::black);linearGrad.setColorAt(1, Qt::white);p.setBrush(linearGrad);QRectF rectangle(100.0, 100.0, 100.0, 100.0);p.drawRoundedRect(rectangle, 20.0, 15.0);p.end();

在这里插入图片描述

结论

人生就是这样,有欢笑也有泪水。一部分人主要负责欢笑,另一部分人主要负责泪水

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

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

相关文章

《天天爱科学》期刊国家级知网投稿

《天天爱科学》国家级期刊知网收录,投稿方向:幼儿教育、基础教育文章,不收案例分析、教学设计、图表讲解、例题分析。 刊名:天天爱科学 主管单位:中国出版传媒股份有限公司 主办单位:人民文学出版社有限…

jmeter接口测试之登录测试

注册登录_登陆接口文档 1.登录 请求地址: POST xxxxxx/Home/Login 请求参数: args{LoginName:"mtest", // 登录名,可以为用户名或邮箱Password:"123456" // 密码" }响应数据: 成功 {"S…

docker 资源控制

Docker的资源控制 对容器使用宿主机的资源进行限制,如cpu,内存,磁盘I/O Docker使用linux自带的功能cgroup(control grouos)是linux内核系统提供的一种可以限制,记录,隔离进程组使用的物理资源 Docker借助这个机制&…

ARM:作业3

按键中断代码编写 代码: key_it.h #ifndef __KEY_IT_H__ #define __KEY_IT_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gic.h"void key1_it_config(); voi…

基于 ESP32-S3 的 Walter 开发板

Walter 是一款基于 ESP32-S3 且拥有 5G LTE 连接功能的新型开源开发套件。 近日,比利时公司 DPTechnics BV 推出了一款基于乐鑫 ESP32-S3 且拥有 5G LTE 连接功能的新型开源开发套件。该套件即将在 Crowd Supply 平台上发布,您可以点击此处了解详情。 无…

class068 更多的动态规划【算法】

class068 更多的动态规划【算法】 算法讲解068【必备】见识更多二维动态规划题目 code1 115. 不同的子序列 // 不同的子序列 // 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数 // 测试链接 : https://leetcode.cn/problems/distinct-subseque…

Mac如何设置control+space切换上一中输入法

#设置方法# *搜索输入法 系统设置-搜索:输入法,并点击键盘快捷键 *点击输入法,勾选:选择上一个输入法,点击完成。

漂亮的WPF界面 流行的一个界面,向上悬浮的窗口,终于试成功了

目前随便打开个APP,就可以看到一个悬浮的窗口 今天测试一下目前流行的一个界面,向上悬浮的窗口,终于试成功了。看着还不错的。

.net core提示The xx field is required,One or more validation errors occurred

访问接口时缺少model中的参数时,会提示: The xx field is required One or more validation errors occurred原因是.net core webapi默认参数为不可空,因此会验证并报错。 解决方案: 在项目的.csproj中,修改Nullable…

Leetcode—2960.统计已测试设备【简单】

2023每日刷题&#xff08;五十六&#xff09; Leetcode—2960.统计已测试设备 实现代码 int countTestedDevices(int* batteryPercentages, int batteryPercentagesSize) {int cnt 0;int ans 0;for(int i 0; i < batteryPercentagesSize; i) {int t batteryPercentage…

装机必备 | 超赞OCR文本识别小工具 Text Scanner

Text Scanner 是一款功能强大的图片扫描工具软件,该软件利用光学字符识别技术&#xff0c;来将图片上的文字内容&#xff0c;直接转换为可编辑文本&#xff0c;实用性很强。 光学字符识别&#xff08;OCR&#xff09;&#xff1a;Text Scanner for Mac采用了先进的OCR技术&…

qt 使用百度在线地图 方法2

使用百度在线地图两个关键点&#xff0c;一是html页面准备&#xff1b;二是qt 与js 语言的交互。 1&#xff0c;html页面的准备&#xff0c;双击页面就可以出现如下效果。 主要代码&#xff1a; <!DOCTYPE html> <html> <head><meta http-equiv"C…

【Maven技术专题】「入门到精通」教你如何使用Maven中引用依赖本地Jar包,并进行打包输出

前言 在使用Maven管理Java项目时&#xff0c;有时需要引入一些存放在系统特定位置的JAR文件。这些JAR文件可能是你自己编写的&#xff0c;也可能是其他来源的。无论是哪种情况&#xff0c;使用 Maven 的 system 范围和 systemPath 参数&#xff0c;可以方便地引入这些本地依赖…

Logstash输入Kafka输出Es配置

Logstash介绍 Logstash是一个开源的数据收集引擎&#xff0c;具有实时管道功能。它可以从各种数据源中动态地统一和标准化数据&#xff0c;并将其发送到你选择的目的地。Logstash的早期目标主要是用于收集日志&#xff0c;但现在的功能已经远远超出这个范围。任何事件类型都可…

Python从入门到精通九:Python异常、模块与包

了解异常 什么是异常 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”, 也就是我们常说的BUG bug单词的诞生 早期计算机采用大量继电器工作&#xff0c;马克二型计算机就是这样的。 19…

理解排序算法:冒泡排序、选择排序与归并排序

简介&#xff1a; 在计算机科学中&#xff0c;排序算法是基础且重要的概念。本文将介绍三种常见的排序方法&#xff1a;冒泡排序、选择排序和归并排序。我们将探讨它们的工作原理、特点和适用场景&#xff0c;以帮助读者更好地理解和选择合适的排序方法。 冒泡排序 冒泡排序是…

logback日志框架使用

依赖引入 <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.7</version> </dependency> 使用logback日志框架只需要引入以上即可&#xff0c;(我们平时使用较多的Slf4j…

浏览器提示不安全

当我们使用浏览器访问一个网站时&#xff0c;如果该网站使用的是HTTPS连接&#xff0c;那么浏览器会对其进行安全性的检查。其中一项重要的检查就是确认该网站是否拥有有效的SSL证书。然而&#xff0c;有时我们会在浏览器中看到“不安全”的警告&#xff0c;这通常是由于SSL证书…

三天精通Selenium Web 自动化 - Selenium(Java)环境搭建

1 下载JDK JDK下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2 安装和配置JDK 安装目录尽量不要有空格 D:\Java\jdk1.8.0_91; D:\Java\jre8设置环境变量&#xff1a; “我的电脑”->右键->“属性”->…

C.小苯的排列构造

C-小苯的排列构造_北京信息科技大学第十五届程序设计竞赛&#xff08;同步赛&#xff09; (nowcoder.com) 凑2很容易想出来&#xff0c;但是2 4 1 3 这个内核不好想&#xff0c;算是一种尝试和经验吧 #include<bits/stdc.h> using namespace std;int n;int main() {cin&g…