2D图形绘制与QPainter

123 阅读9分钟

 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不同模式和状态下的可伸缩图标
QIconEngineQIcon渲染器的抽象基类
QImage独立于硬件的图像表示,允许直接访问像素数据,并且可以用作绘画设备
QImageReader格式独立的接口,读取图像从文件或其他设备
QImageWriter用于将图像写入文件或其他设备的格式独立接口
QLine二维矢量采用整数精度
QLineF二维矢量使用浮点精度
QLinearGradient与QBrush结合使用,指定线性梯度刷
QMargins定义矩形的四个边距
QMarginsF定义矩形的四个边距
QPagedPaintDevice表示支持多个页面的绘制设备
QPaintDevice可以用QPainter绘制的对象的基类
QPaintEngineQPainter如何在给定平台上绘制给定设备的抽象定义
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