1. 简介

在QT中所有的绘图操作都是通过QPainter来完成的,甚至QT自身所有控件窗口的绘制都是通过QPainter绘制显示。另外QPainterDevice为作为绘图设备存在。其实最后所有的操作都是通过QT自身的QPainterEngine来实现一些的绘制渲染。

  1. 绘制流程

    1. QPainter提供绘制接口

对于QPainter来说,内部有一个状态堆栈,任何时候都可以通过调用 save() 和 restore() 对QPainter的内部状态执行进栈保存和压栈还原的操作。

提供了大部分基本二维几何元的绘制命令,如:drawPoint()、drawPoints()、drawLine()、drawRect()、drawRoundedRect()、drawEllipse()、drawArc()、drawPie()、drawChord()、drawPolyline()、drawPolygon()、drawConvexPolygon() 和 drawCubicBezier(),还提供了 fillPath 来填充 QPainterPath 组成的形状和strokePath()来绘制给定path的边缘。也提供了一些列绘图命令来绘制 pixmaps 和 images, 它们是: drawPixmap()、drawImage(),其中 drawPixmap(),和 drawImage() 产生的效果是一样的,只是drawPixmap在屏幕上绘制比较快,而drawImage 在 QPrinter 和其他设备上绘制会比较快,文字绘制用接口 drawText()等。


    1. QPainterDevice提供绘制刷新

在QT程序中通过事件驱动刷新界面,包括窗口大小改变以及拖动等操作。QT中子窗口通过paint函数调用painterEvent周期函数,刷新客户端绘制操作。对于三维绘制则需要通过flush函数来实现sawapBuffer渲染。如图 2.1 绘制流程所示


图 2.1 绘制流程


    1. QPainterEngine提供绘制实现

在QT5中可以通过QPA来指定不同平台下的QWindow、QScreen、QOpengGLContext的实现方式。那么对于不同平台的QPainterEngine也有不同的实现方式。如图 2.2 QPainterEngine不同平台下实现方式所示


图 2.2 QPainterEngine不同平台下实现方式