绘图设备和后端

创建绘图设备

QPaintDevice 类是能够被绘制的对象的基类,也就是说,QPainter 可以在任何 QPaintDevice 子类上进行绘制。QPaintDevice 的绘图功能由 QWidget、QImageQPixmapQPicture、QPrinter 和 QOpenGLPaintDevice 等实现。

Widget

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

图像

QImage 类提供了一个硬件无关的图像表示,它被设计和优化用于I/O操作,以及直接的像素访问和操作。QImage 支持多种图像格式,包括单色、8位、32位和带有alpha混合的图像。

使用 QImage 作为绘图设备的一个优势是,可以保证在任何绘图操作中的像素精确性,这种方式是平台无关的。另一个好处是,绘图可以在与当前GUI线程不同的另一个线程中执行。

Pixmap

QPixmap 类是一个离屏图像表示,它被设计和优化用于在屏幕上显示图像。与 QImage 不同,pixmap 中的像素数据是内部的,并由底层窗口系统管理,即像素只能通过 QPainter 函数或通过将 QPixmap 转换为 QImage 来访问。

为了优化使用 QPixmap 的绘图,Qt 提供了 QPixmapCache 类,该类可用于存储生成成本高且不超过缓存限制的临时 pixmap。

Qt 还提供了继承自 QPixmap 的便捷类 QBitmapQBitmap 保证单色(1位深度)pixmap,主要用于创建自定义的 QCursorQBrush 对象,构建 QRegion 对象。

OpenGL 绘图设备

如前所述,Qt 提供了使在 Qt 应用程序中使用 OpenGL 变得容易的类。例如,QOpenGLPaintDevice 启用了 OpenGL API,以便与 QPainter 一起进行渲染。

图片

QPicture 类是一个绘制设备,用于记录和回放 QPainter 命令。图片以平台无关的格式将绘制命令序列化到IO设备。QPicture 也是分辨率无关的,即 QPicture 可以在不同的设备上显示(例如 svg、pdf、ps、打印机和屏幕),看起来相同。

Qt 提供了 load()save() 函数以及流操作符来加载和保存图片。

自定义后端

可以通过从QPaintDevice类派生并重新实现虚拟paintEngine()函数来支持新的后端,以告诉QPainter应该使用哪种绘图引擎在此特定设备上绘制。为了能够在此设备上实际绘制,此绘图引擎必须是通过从QPaintEngine类派生创建的自定义绘图引擎。