定义:

QPaintEngine 类提供了 QPainter 如何在给定平台上绘制给定设备的抽象定义。

如果想使用 QPainter 绘制到不同的后端(backend),则必须继承 QPaintEngine 并重新实现其所有虚函数。然后通过继承 QPaintDevice 并重新实现虚函数 QPaintDevice::paintEngine() 来实现 QPaintEngine。

class Q_GUI_EXPORT QPaintEngine
{Q_DECLARE_PRIVATE(QPaintEngine)
public:enum PaintEngineFeature {PrimitiveTransform          = 0x00000001, // Can transform primitives brushesPatternTransform            = 0x00000002, // Can transform pattern brushesPixmapTransform             = 0x00000004, // Can transform pixmapsPatternBrush                = 0x00000008, // Can fill with pixmaps and standard patternsLinearGradientFill          = 0x00000010, // Can fill gradient areasRadialGradientFill          = 0x00000020, // Can render radial gradientsConicalGradientFill         = 0x00000040, // Can render conical gradientsAlphaBlend                  = 0x00000080, // Can do source over alpha blendPorterDuff                  = 0x00000100, // Can do general porter duff compositionsPainterPaths                = 0x00000200, // Can fill, outline and clip pathsAntialiasing                = 0x00000400, // Can antialias linesBrushStroke                 = 0x00000800, // Can render brush based pensConstantOpacity             = 0x00001000, // Can render at constant opacityMaskedBrush                 = 0x00002000, // Can fill with textures that has an alpha channel or maskPerspectiveTransform        = 0x00004000, // Can do perspective transformationsBlendModes                  = 0x00008000, // Can do extended Porter&Duff compositionObjectBoundingModeGradients = 0x00010000, // Can do object bounding mode gradientsRasterOpModes               = 0x00020000, // Can do logical raster operationsPaintOutsidePaintEvent      = 0x20000000, // Engine is capable of painting outside paint events/*                          0x10000000, // Used for emulatingQGradient::StretchToDevice,defined in qpainter.cpp0x40000000, // Used internally for emulating opaque backgrounds*/AllFeatures               = 0xffffffff  // For convenience};Q_DECLARE_FLAGS(PaintEngineFeatures, PaintEngineFeature)enum DirtyFlag {DirtyPen                = 0x0001,DirtyBrush              = 0x0002,DirtyBrushOrigin        = 0x0004,DirtyFont               = 0x0008,DirtyBackground         = 0x0010,DirtyBackgroundMode     = 0x0020,DirtyTransform          = 0x0040,DirtyClipRegion         = 0x0080,DirtyClipPath           = 0x0100,DirtyHints              = 0x0200,DirtyCompositionMode    = 0x0400,DirtyClipEnabled        = 0x0800,DirtyOpacity            = 0x1000,AllDirty                = 0xffff};Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)enum PolygonDrawMode {OddEvenMode,WindingMode,ConvexMode,PolylineMode};explicit QPaintEngine(PaintEngineFeatures features=PaintEngineFeatures());virtual ~QPaintEngine();bool isActive() const { return active; }void setActive(bool newState) { active = newState; }virtual bool begin(QPaintDevice *pdev) = 0;virtual bool end() = 0;virtual void updateState(const QPaintEngineState &state) = 0;virtual void drawRects(const QRect *rects, int rectCount);virtual void drawRects(const QRectF *rects, int rectCount);virtual void drawLines(const QLine *lines, int lineCount);virtual void drawLines(const QLineF *lines, int lineCount);virtual void drawEllipse(const QRectF &r);virtual void drawEllipse(const QRect &r);virtual void drawPath(const QPainterPath &path);virtual void drawPoints(const QPointF *points, int pointCount);virtual void drawPoints(const QPoint *points, int pointCount);virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);virtual void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode);virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) = 0;virtual void drawTextItem(const QPointF &p, const QTextItem &textItem);virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s);virtual void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,Qt::ImageConversionFlags flags = Qt::AutoColor);void setPaintDevice(QPaintDevice *device);QPaintDevice *paintDevice() const;void setSystemClip(const QRegion &baseClip);QRegion systemClip() const;void setSystemRect(const QRect &rect);QRect systemRect() const;virtual QPoint coordinateOffset() const;enum Type {X11,Windows,QuickDraw, CoreGraphics, MacPrinter,QWindowSystem,PostScript,   // ### Qt 6: Remove, update documentationOpenGL,Picture,SVG,Raster,Direct3D,Pdf,OpenVG,OpenGL2,PaintBuffer,Blitter,Direct2D,User = 50,    // first user type idMaxUser = 100 // last user type id};virtual Type type() const = 0;inline void fix_neg_rect(int *x, int *y, int *w, int *h);inline bool testDirty(DirtyFlags df);inline void setDirty(DirtyFlags df);inline void clearDirty(DirtyFlags df);bool hasFeature(PaintEngineFeatures feature) const { return gccaps & feature; }QPainter *painter() const;void syncState();inline bool isExtended() const { return extended; }
protected:QPaintEngine(QPaintEnginePrivate &data, PaintEngineFeatures devcaps=PaintEngineFeatures());QPaintEngineState *state;PaintEngineFeatures gccaps;uint active : 1;uint selfDestruct : 1;uint extended : 1;QScopedPointer<QPaintEnginePrivate> d_ptr;
private:void setAutoDestruct(bool autoDestr) { selfDestruct = autoDestr; }bool autoDestruct() const { return selfDestruct; }Q_DISABLE_COPY(QPaintEngine)friend class QPainterReplayer;friend class QFontEngineBox;friend class QFontEngineMac;friend class QFontEngineWin;friend class QMacPrintEngine;friend class QMacPrintEnginePrivate;friend class QFontEngineQPF2;friend class QPainter;friend class QPainterPrivate;friend class QWidget;friend class QWidgetPrivate;friend class QWin32PaintEngine;friend class QWin32PaintEnginePrivate;friend class QMacCGContext;friend class QPreviewPaintEngine;friend class QX11GLPlatformPixmap;
};

下次,解析一下QPainter

Qt源码分析--QPaintEngine相关推荐

  1. Qt源码分析之QObject

    Qt的QObject 1.试验代码: #include <QApplication> #include <QtCore> #include <QtGui> int ...

  2. Qt源码分析之信号和槽机制

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的 说法,简单点说就是如何在一个类的一 ...

  3. Qt源码分析--QImage(1)

    QImage 类提供独立于硬件的图像表示 (允许直接访问像素数据,且可以用作描绘设备). QImage 是为 I/O 和直接像素访问和操作而设计和优化的. 因为 QImage 是 QPaintDevi ...

  4. Qt源码分析--QImage(8)

    1.void setDotsPerMeterX(int); 设置每米有多少个像素 /*!Sets the number of pixels that fit horizontally in a phy ...

  5. Qt源码分析--QSettings

    定义: QSettings 类提供与平台无关的持久应用程序设置. 官方例子: QSettings settings("MySoft", "Star Runner" ...

  6. 【Qt】Log4Qt(三)源码分析

    Log4Qt(三)源码分析 1.分层架构 1.1 核心对象 1.2 支持对象 2.源码分析 2.1 宏 2.1.1 LOG4QT_DECLARE_QCLASS_LOGGER 2.1.2 LOG4QT_ ...

  7. Qt 事件机制源码分析 QApplication exec 源码分析 多图超级详细

    前言: 不熟悉qt 源码结构的 可以先看这一篇 点我点我点我 写qt 的都知道 以下代码, 这段代码究竟的运行机制是怎么样的 咱们一步一步的看 QApplication a(argc, argv);Q ...

  8. Solr初始化源码分析-Solr初始化与启动

    用solr做项目已经有一年有余,但都是使用层面,只是利用solr现有机制,修改参数,然后监控调优,从没有对solr进行源码级别的研究.但是,最近手头的一个项目,让我感觉必须把solrn内部原理和扩展机 ...

  9. 14.QueuedConnection和BlockingQueuedConnection连接方式源码分析

    QT信号槽直连时的时序和信号槽的连接方式已经在前面的文章中分析过了,见https://blog.csdn.net/Master_Cui/article/details/109011425和https: ...

  10. sigslot库源码分析

    言归正传,sigslot是一个用标准C++语法实现的信号与槽机制的函数库,类型和线程安全.提到信号与槽机制,恐怕最容易想到的就是大名鼎鼎的Qt所支持的对象之间通信的模式吧.不过这里的信号与槽虽然在概念 ...

最新文章

  1. php mysql or_mysql条件查询and or使用方法及优先级实例分析
  2. MarkDown需要掌握的几个基本语法
  3. Struts2学习笔记(六):Struts2的处理流程与Action的管理方式
  4. 【科普】国内外高质量数据科学竞赛平台有哪些?
  5. 安装labelImg(win10,macOS)
  6. RHEL 6.0安装Qt
  7. 要求程序员加班?你就大错特错了
  8. matlab ascii 异或,GPS数据包的ASCII异或校验和计算方法(VC++)
  9. android开发入门配置,Android开发入门——Andoird Studio的安装与配置
  10. 跨境电商四种物流方式介绍-扬帆凌远
  11. 云计算分布式架构简介
  12. Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)(单调栈)
  13. vue3.0的多种写法,你喜欢哪种呢?
  14. 线性表进阶___约瑟夫环问题
  15. HTML5讲解与演示转载整理
  16. setTimeout 实现 setInterval
  17. 什么是多态?实现多态的机制是什么?
  18. JVM,JER,JDK各自的作用和之间的联系
  19. 求生之路2服务器ip直连,正版求生之路2好友直连显示该会话已不可用,无法联机...
  20. 【数学建模学习】matlab实现评价模型——层次分析法(AHP)

热门文章

  1. 3G、4G、5G背后的科学含义,你真的懂吗?
  2. 从百草园到三味书屋感想
  3. SEO人员必备技术有哪些
  4. 哪个音频格式转换器最好用
  5. ArcGIS读取天地图2.0
  6. 使用Uber-go Zap日志库
  7. 重庆小飞龙前端第一天----了解html
  8. 小米手机android程序闪退,小米手机软件闪退是什么原因
  9. Android 多语言应用(步骤+源码)
  10. 百度网盘分享旁边的个人说明如何修改