QPaintEngine Class

QPaintEngine类为QPainter提供了如何在指定绘图设备上(译者注:一般为QPaintDevice的派生)绘制的一些抽象的方法。

属性方法
头文件#include <QPaintEngine>
qmakeQT+=core

公共成员类型

类型方法
enumDirtyFlag { DirtyPen, DirtyBrush, DirtyBrushOrigin, DirtyFont, DirtyBackground, …, AllDirty }
flagsDirtyFlags
enumPaintEngineFeature { AlphaBlend, Antialiasing, BlendModes, BrushStroke, ConicalGradientFill, …, AllFeatures }
flagsPaintEngineFeatures
enumPolygonDrawMode { OddEvenMode, WindingMode, ConvexMode, PolylineMode }
enumType { X11, Windows, MacPrinter, CoreGraphics, QuickDraw, …, Direct2D }

公共成员函数

返回类型函数名
QPaintEngine(QPaintEngine::PaintEngineFeatures caps = PaintEngineFeatures())
virtual~QPaintEngine()
virtual boolbegin(QPaintDevice *pdev) = 0
virtual voiddrawEllipse(const QRectF &rect)
virtual voiddrawEllipse(const QRect &rect)
virtual voiddrawImage(const QRectF &rectangle, const QImage &image, const QRectF &sr, Qt::ImageConversionFlags flags = Qt::AutoColor)
virtual voiddrawLines(const QLineF *lines, int lineCount)
virtual voiddrawLines(const QLine *lines, int lineCount)
virtual voiddrawPath(const QPainterPath &path)
virtual voiddrawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) = 0
virtual voiddrawPoints(const QPointF *points, int pointCount)
virtual voiddrawPoints(const QPoint *points, int pointCount)
virtual voiddrawPolygon(const QPointF *points, int pointCount, QPaintEngine::PolygonDrawMode mode)
virtual voiddrawPolygon(const QPoint *points, int pointCount, QPaintEngine::PolygonDrawMode mode)
virtual voiddrawRects(const QRectF *rects, int rectCount)
virtual voiddrawRects(const QRect *rects, int rectCount)
virtual voiddrawTextItem(const QPointF &p, const QTextItem &textItem)
virtual voiddrawTiledPixmap(const QRectF &rect, const QPixmap &pixmap, const QPointF &p)
virtual boolend() = 0
boolhasFeature(QPaintEngine::PaintEngineFeatures feature) const
boolisActive() const
QPaintDevice *paintDevice() const
QPainter *painter() const
voidsetActive(bool state)
virtual QPaintEngine::Typetype() const = 0
virtual voidupdateState(const QPaintEngineState &state) = 0

详细介绍

Qt为不同的painter后端提供了一些预设实现的QPaintEngine

译者注:提供一个更加好理解的说法。QPainter的Qt实现一般默认调用的是QPaintEngine的方法。

现在QPaintEngine主要提供的是Qt自带的光栅化引擎(raster engine),Qt在他所有支持的平台上,提供了一个功能完备的光栅化引擎。

在Windows, X11 和 macOS平台上,Qt自带的光栅化引擎都是QWidget这个基础类的默认的绘制方法的提供者,亦或是QImage的绘制方法的提供者。当然有一些特殊的绘制设备的绘制引擎不提供对应的绘制方法,这时候就会调用默认的光栅化引擎。

当然,我们也为OpenGL(可通过QOpenGLWidget访问)跟打印(允许QPainter在QPrinter对象上绘制,用于生成pdf之类的)也提供了对应的QPaintEngine的实现。

译者注: QPainter,QPainterEngine,QPaintDevice三个是相辅相成的。

  • QPainter为开发者提供外部接口方法用于绘制
  • QPaintEngine为QPainter提供一些绘制的具体实现
  • QPaintDevice为QPainter提供一个绘图设备,用于显示亦或储存。

如果你想使用QPainter绘制自定义的后端(译者注:这里可以理解为QPaintDevice)。你可以继承QPaintEngine,并实现其所有的虚函数。然后子类化QPaintDevice并且实现它的纯虚成员函数(QPaintDevice::paintEngine())。

由QPaintDevice创建QPaintEngine,并维护其生命周期。

另请参见QPainter,QPaintDevice::paintEngine()和Paint System


成员类型文档

enum QPaintEngine::DirtyFlag

flags QPaintEngine::DirtyFlags

枚举类型枚举值描述
QPaintEngine::DirtyPen0x0001画笔已经标脏,应刷新
QPaintEngine::DirtyBrush0x0002画刷已经标脏,应刷新
QPaintEngine::DirtyBrushOrigin0x0004画刷原始数据已经变化,应刷新
QPaintEngine::DirtyFont0x0008字体发生变化,应刷新
QPaintEngine::DirtyBackground0x0010背景标脏,应刷新
QPaintEngine::DirtyBackgroundMode0x0020背景状态标脏,应刷新
QPaintEngine::DirtyTransform0x0040当前矩阵标脏,应刷新
QPaintEngine::DirtyClipRegion0x0080当前裁剪区域标脏,应刷新
QPaintEngine::DirtyClipPath0x0100裁剪路径标脏,应刷新
QPaintEngine::DirtyHints0x0200当前绘制精度标志变化,应刷新
QPaintEngine::DirtyCompositionMode0x0400绘制组合模式变化,应刷新
QPaintEngine::DirtyClipEnabled0x0800无论是否当前可裁剪,都应刷新
QPaintEngine::DirtyOpacity0x1000当前透明度已经更改,应当使用QPaintEngine::updateState()来进行刷新
QPaintEngine::AllDirty0xffff内部枚举使用变量。

QPaintEngine使用函数QPaintEngine::updateState()来通知QPainter的延迟刷新。

一个绘制引擎必须更新上面所有的标脏状态(译者注:比如你自定义一个QPaintEngine,就需要处理上面的所有的状态的刷新)

一个标脏枚举使用QFlags类型。 这些类型可以异或使用的。(译者注:比如 QPaintEngine::DirtyPen | QPaintEngine::DirtyBrush 看他们枚举值就看出来了)


enum QPaintEngine::PaintEngineFeature

flags QPaintEngine::PaintEngineFeatures

枚举类型枚举值描述
ConstantValueDescription
QPaintEngine::AlphaBlend0x00000080引擎可以使用透明通道
QPaintEngine::Antialiasing0x00000400引擎可以使用抗锯齿来改善渲染图元的外观。
QPaintEngine::BlendModes0x00008000引擎支持混合模式。
QPaintEngine::BrushStroke0x00000800引擎支持画刷描边操作,并不是仅仅是纯色(比如2倍线宽的渐变虚线)
QPaintEngine::ConicalGradientFill0x00000040引擎支持锥形渐变填充。
QPaintEngine::ConstantOpacity0x00001000该引擎支持QPainter :: setOpacity()提供的功能。
QPaintEngine::LinearGradientFill0x00000010引擎支持线性渐变填充。
QPaintEngine::MaskedBrush0x00002000该引擎能够渲染具有带有Alpha通道或蒙版的纹理的笔刷。
QPaintEngine::ObjectBoundingModeGradients0x00010000该引擎对坐标模式为QGradient :: ObjectBoundingMode的渐变具有本地支持。否则,如果支持QPaintEngine :: PatternTransform,则将对象边界模式渐变转换为具有坐标模式QGradient :: LogicalMode和用于坐标映射的画笔变换的渐变。
QPaintEngine::PainterPaths0x00000200引擎支持路径
QPaintEngine::PaintOutsidePaintEvent0x20000000该引擎能够在绘制事件之外进行绘制。
QPaintEngine::PatternBrush0x00000008引擎能够使用Qt::BrushStyle中指定的画笔图案渲染画笔。
QPaintEngine::PatternTransform0x00000002该引擎支持转换画笔图案。
QPaintEngine::PerspectiveTransform0x00004000该引擎支持对基元执行透视转换。
QPaintEngine::PixmapTransform0x00000004该引擎可以变换像素图,包括旋转和剪切。
QPaintEngine::PorterDuff0x00000100该引擎支持Porter-Duff操作
QPaintEngine::PrimitiveTransform0x00000001该引擎支持转换绘图图元。
QPaintEngine::RadialGradientFill0x00000020引擎支持径向渐变填充。
QPaintEngine::RasterOpModes0x00020000引擎支持按位栅格操作。
QPaintEngine::AllFeatures0xffffffff以上所有功能。此枚举值通常用作位掩码。

PaintEngineFeatures类型是QFlags<PaintEngineFeature>的typedef 。它存储PaintEngineFeature值的OR组合。(也就是里面的值是可以异或的)