2D 图形绘制与 QPainter

2D 图形绘制与 QPainter

QPainter 提供了绘制向量图形、文本和图像到不同表面(如 QImage、QOpenGLPaintDevice、QWidget 和 QPrinter 等 QPaintDevice 实例)的 API。实际的绘制操作在 QPaintDevice 的 QPaintEngine 中进行。QPaintEngine 中最重要的两个实现是软件光栅化器和 OpenGL (ES) 2.0 后端。软件光栅化器是 Qt 的软件光栅化器,用于在 QImage 或 QWidget 上绘制时使用。与 OpenGL 绘制引擎相比,其优点是在启用抗锯齿时具有较高的质量和完整的功能集。

  • 绘图系统- 概述 QPainter 类及其体系结构。
  • 坐标系统- 解释 QPainter 坐标系统的工作原理。
  • 绘图和填充 - 解释 QPainter 是如何执行向量形状的填充和轮廓绘制的。

QPainter 最重要的绘图目标是:

  • QImage - 一种硬件无关的图像表示形式,可以直接访问像素。QPainter 将使用软件光栅化器在 QImage 实例上绘制图形。
  • QPixmap - 一种适用于在屏幕上显示的图像表示形式。QPainter 将主要使用软件光栅化器在 QPixmap 实例上绘制图形。
  • QOpenGLPaintDevice - 一个用于向当前 OpenGL (ES) 2.0 上下文渲染的画布设备。QPainter 将使用硬件加速的 OpenGL 调用来在 QOpenGLPaintDevice 实例上绘制图形。
  • QBackingStore - 顶层窗口的后缓冲区。QPainter 将主要使用软件光栅化器在 QBackingStore 实例上绘制图形。
  • QWidget - Qt Quick 用户界面类的基类。QPainter 将使用 QBackingStore 绘制 widgets。
  • QOpenGLWidget - QPainter 也可以在 QOpenGLWidget 上打开。这作为一种便利提供,因为从技术上讲,这与使用 QOpenGLPaintDevice 没有区别。

QPainter 及其相关类是 Qt GUI 模块的一部分。

绘图系统

Qt 的绘图系统使用相同的 API 来在屏幕和打印设备上进行绘图,主要基于 QPainter、QPaintDevice 和 QPaintEngine 类。
QPainter用于执行绘图操作,QPaintDevice是一个抽象类,用于表示可以使用QPainter进行绘画的二维空间,而QPaintEngine则提供了QPainter用于在不同类型的设备上进行绘图的接口。QPaintEngine类在QPainter和QPaintDevice内部使用,除非应用程序开发人员创建自己的设备类型,否则该类对应用程序开发人员是隐藏的。

这种方法的主要好处是,所有绘画都遵循相同的绘画管道,这使得很容易添加对新功能的支持,并为未支持的功能提供默认实现。

主题

绘画类

这些类为在绘图设备上绘画提供了支持。

QBitmap

单色(1位深度)像素图

QBrush

定义由QPainter绘制的形状的填充模式

QColor

基于RGB, HSV或CMYK值的颜色

QColorSpace

色彩空间抽象

QColorTransform

色彩空间之间的转换

QColormap

将与设备无关的QColors映射到与设备相关的像素值

QConicalGradient

与QBrush结合使用,指定锥形梯度刷

QFont

指定用于绘制文本的字体的查询

QFontMetrics

字体度量信息

QFontMetricsF

字体度量信息

QGenericMatrix

模板类,表示有N列和M行的NxM变换矩阵

QGradient

与QBrush结合使用来指定渐变填充

QIcon

不同模式和状态下的可伸缩图标

QIconEngine

QIcon渲染器的抽象基类

QImage

独立于硬件的图像表示,允许直接访问像素数据,并且可以用作绘画设备

QImageReader

格式独立的接口,读取图像从文件或其他设备

QImageWriter

用于将图像写入文件或其他设备的格式独立接口

QLine

二维矢量采用整数精度

QLineF

二维矢量使用浮点精度

QLinearGradient

与QBrush结合使用,指定线性梯度刷

QMargins

定义矩形的四个边距

QMarginsF

定义矩形的四个边距

QPagedPaintDevice

表示支持多个页面的绘制设备

QPaintDevice

可以用QPainter绘制的对象的基类

QPaintEngine

QPainter如何在给定平台上绘制给定设备的抽象定义

QPainter

在小部件和其他绘制设备上执行低级绘制

QPainterPath

用于绘制操作的容器,使图形形状能够被构造和重用

QPainterPathStroker

用于为给定的画家路径生成可填充的轮廓

QPdfWriter

类生成可用作绘图设备的pdf

QPen

定义QPainter应该如何绘制形状的线条和轮廓

QPixmap

可以用作绘画设备的屏幕外图像表示

QPoint

使用整数精度在平面上定义一个点

QPointF

使用浮点精度在平面上定义一个点

QPolygon

向量点使用整数精度

QPolygonF

向量点使用浮点精度

QRadialGradient

与QBrush结合使用,指定径向梯度刷

QRect

使用整数精度在平面上定义一个矩形

QRectF

使用浮点精度在平面中定义一个矩形

QRegion

指定绘图器的剪辑区域

QRgba64

结构包含64位RGB颜色

QSize

使用整数点精度定义二维对象的大小

QSizeF

使用浮点精度定义二维对象的大小

QStylePainter

用于在小部件内绘制QStyle元素的方便类

QSupportedWritingSystems

在使用内部Qt字体数据库注册字体时使用

QSvgGenerator

用于创建SVG绘图的绘图设备

QSvgRenderer

用于将SVG文件的内容绘制到绘图设备上

QSvgWidget

小部件,用于显示可缩放矢量图形(SVG)文件的内容

QTransform

指定坐标系统的2D转换

QVector2D

表示二维空间中的向量或顶点

绘图和填充

绘图

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

QPainterPath
画家路径是由线条和曲线组成的对象。例如,矩形由直线组成,椭圆由曲线组成。
与普通绘图操作相比,绘制路径的主要优势在于,复杂的形状只需要创建一次;然后只需调用QPainter::drawPath()函数就可以多次绘制它们。
QPainterPath对象可用于填充、勾勒和裁剪。要为给定的画家路径生成可填充的轮廓,请使用QPainterPathStroker类

使用QPen类绘制线条和轮廓。笔由其样式(即线型)、宽度、画笔、端点绘制方式(封口样式)以及两条相连线条之间连接处的绘制方式(连接样式)来定义。笔的画笔是一个QBrush对象,用于填充使用该笔生成的线条,即QBrush类定义了填充模式。
QPainter还可以绘制对齐文本和位图。
在绘制文本时,使用 QFont 类来指定字体。Qt 将使用指定属性的字体,或者如果找不到匹配的字体,则使用安装的与之最接近的字体。实际上使用的字体的属性可以使用 QFontInfo 类获取。此外,QFontMetrics 类提供了字体测量信息,而 QFontDatabase 类则提供了底层窗口系统中可用字体的信息。
通常情况下,QPainter使用“自然”坐标系进行绘图,但它可以通过QTransform类执行视图和世界变换。有关更多信息,请参见坐标系,其中还描述了绘制过程,即逻辑表示与渲染像素之间的关系,以及抗锯齿绘图的好处。

抗锯齿绘画
在绘画时,像素渲染由 QPainter::Antialiasing 渲染提示控制。QPainter::RenderHint 枚举用于指定标志,这些标志可能或可能不会被任何给定的引擎尊重。
QPainter::Antialiasing 值表示引擎应该在可能的情况下对基本图形的边缘进行抗锯齿处理,即通过使用不同的颜色强度来平滑边缘。

填充

使用 QBrush 类可以为形状填充颜色。刷子由其颜色和样式(即填充模式)定义。

在Qt中,任何颜色都由QColor类表示,该类支持RGB、HSV和CMYK颜色模型。QColor还支持透明度混合的轮廓和填充(指定透明效果),并且该类是平台和设备无关的(颜色通过QColormap类映射到硬件)。有关更多信息,请参阅QColor类文档。

可用的填充模式由Qt::BrushStyle枚举描述。这些模式包括从均匀颜色到非常稀疏图案的基本模式,各种线条组合,渐变填充和纹理。Qt提供了QGradient类来定义自定义渐变填充,而纹理图案则使用QPixmap类指定。

QGradient
QGradient类与QBrush结合使用来指定渐变填充。

Qt目前支持三种类型的梯度填充:线性梯度在起点和终点之间插入颜色,径向梯度在焦点和围绕它的圆上的终点之间插入颜色,圆锥形梯度在中心点周围插入颜色。

读取和写入图像文件

读取图像最常见的方式是通过QImage和QPixmap的构造函数,或者调用QImage::load()和QPixmap::load()函数。此外,Qt还提供了QImageReader类,它可以更灵活地控制读取过程。根据图像格式的底层支持,该类提供的函数可以节省内存并加快图像加载速度。

同样地,Qt提供了QImageWriter类,可以在存储图像之前设置格式特定的选项,例如伽马值、压缩级别和质量等。如果您不需要这些选项,可以使用QImage::save()或QPixmap::save()代替。

QMovie
QMovie是一个用于显示动画的方便类,在内部使用QImageReader类。创建后,QMovie类为运行和控制给定动画提供了各种函数。

QImageReader和QImageWriter类依赖于QImageIOHandler类,它是Qt中所有图像格式的通用图像I/O接口。QImageIOHandler对象在QImageReader和QImageWriter内部使用,以为Qt添加对不同图像格式的支持。

可以通过QImageReader::supportedImageFormats()和QImageWriter::supportedImageFormats()函数获取支持的文件格式列表。Qt默认支持几种文件格式,并且可以通过插件添加新的格式。目前支持的格式在QImageReader和QImageWriter类文档中列出。

Qt 的插件机制也可以用来编写自定义图像格式处理程序。这可以通过从 QImageIOHandler 类派生,并创建一个 QImageIOPlugin 对象来实现,该对象是一个创建 QImageIOHandler 对象的工厂。当插件安装后,QImageReader 和 QImageWriter 会自动加载该插件并开始使用它。

Paint System | Qt GUI 5.15.17

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

You can do more

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值