2D 图形绘制与 QPainter
QPainter 提供了绘制向量图形、文本和图像到不同表面(如 QImage、QOpenGLPaintDevice、QWidget 和 QPrinter 等 QPaintDevice 实例)的 API。实际的绘制操作在 QPaintDevice 的 QPaintEngine 中进行。QPaintEngine 中最重要的两个实现是软件光栅化器和 OpenGL (ES) 2.0 后端。软件光栅化器是 Qt 的软件光栅化器,用于在 QImage 或 QWidget 上绘制时使用。与 OpenGL 绘制引擎相比,其优点是在启用抗锯齿时具有较高的质量和完整的功能集。
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内部使用,除非应用程序开发人员创建自己的设备类型,否则该类对应用程序开发人员是隐藏的。
这种方法的主要好处是,所有绘画都遵循相同的绘画管道,这使得很容易添加对新功能的支持,并为未支持的功能提供默认实现。
主题
绘画类
这些类为在绘图设备上绘画提供了支持。
单色(1位深度)像素图 | |
定义由QPainter绘制的形状的填充模式 | |
基于RGB, HSV或CMYK值的颜色 | |
色彩空间抽象 | |
色彩空间之间的转换 | |
将与设备无关的QColors映射到与设备相关的像素值 | |
与QBrush结合使用,指定锥形梯度刷 | |
指定用于绘制文本的字体的查询 | |
字体度量信息 | |
字体度量信息 | |
模板类,表示有N列和M行的NxM变换矩阵 | |
与QBrush结合使用来指定渐变填充 | |
不同模式和状态下的可伸缩图标 | |
QIcon渲染器的抽象基类 | |
独立于硬件的图像表示,允许直接访问像素数据,并且可以用作绘画设备 | |
格式独立的接口,读取图像从文件或其他设备 | |
用于将图像写入文件或其他设备的格式独立接口 | |
二维矢量采用整数精度 | |
二维矢量使用浮点精度 | |
与QBrush结合使用,指定线性梯度刷 | |
定义矩形的四个边距 | |
定义矩形的四个边距 | |
表示支持多个页面的绘制设备 | |
可以用QPainter绘制的对象的基类 | |
QPainter如何在给定平台上绘制给定设备的抽象定义 | |
在小部件和其他绘制设备上执行低级绘制 | |
用于绘制操作的容器,使图形形状能够被构造和重用 | |
用于为给定的画家路径生成可填充的轮廓 | |
类生成可用作绘图设备的pdf | |
定义QPainter应该如何绘制形状的线条和轮廓 | |
可以用作绘画设备的屏幕外图像表示 | |
使用整数精度在平面上定义一个点 | |
使用浮点精度在平面上定义一个点 | |
向量点使用整数精度 | |
向量点使用浮点精度 | |
与QBrush结合使用,指定径向梯度刷 | |
使用整数精度在平面上定义一个矩形 | |
使用浮点精度在平面中定义一个矩形 | |
指定绘图器的剪辑区域 | |
结构包含64位RGB颜色 | |
使用整数点精度定义二维对象的大小 | |
使用浮点精度定义二维对象的大小 | |
用于在小部件内绘制QStyle元素的方便类 | |
在使用内部Qt字体数据库注册字体时使用 | |
用于创建SVG绘图的绘图设备 | |
用于将SVG文件的内容绘制到绘图设备上 | |
小部件,用于显示可缩放矢量图形(SVG)文件的内容 | |
指定坐标系统的2D转换 | |
表示二维空间中的向量或顶点 |
绘图和填充
绘图
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 会自动加载该插件并开始使用它。