26 QPainter基本绘图

借助QPainter类的实例化对象,可以在绘制设备上绘制各种二维图形。绘制设备包括QWidget、QPixmap、QImage等。所绘制的点、线、面等几何图形,是不能与用户发生交互的纯视觉元素。

26.1 绘图系统

26.1.1 QPainter、QPaintDevice和QPaintEngine

Qt的绘图系统使用户可以在屏幕和打印机上,基于同一套APIs完成图形绘制。Qt的绘图系统由QPainter、QPaintDevice和QPaintEngine三个类组成。QPainter类提供表示具体绘制动作的接口。PainterDevice类表示可在其上绘制图形的二维表面。QPaintEngine类提供在不同设备上完成图形渲染的接口,仅在QPainter类和QPaintDevice类内部使用。应用程序一般无需与QPaintEngine打交道,除非要自己创建某种特殊的设备类型。Qt支持的绘制设备包括QWidget、QPixmap、QImage等,这些绘制设备在QPainter看来,就是一张张“画布”。

绘制设备
绘图系统
QWidget
QPixmap
QImage
QPainter
QPaintDevice
QPaintEngine

26.1.2 paintEvent事件与绘图区

QWidget类及其子类是最常用的绘制设备。QWidget类的所有子类都可以通过覆盖其基类的paintEvent虚函数,响应绘制事件,执行绘制动作。在该虚函数的实现中,只需实例化一个QPainter类的对象,并将作为“画布”的绘制设备交给该对象即可。之后通过该对象完成的所有绘制动作,都会呈现在指定的绘制设备上。

QWidget的绘图区就是其窗口内部的矩形区域。绘图区中的坐标以像素为单位,坐标系的原点位于绘图区的左上角,X轴向右为正,Y轴向下为正。绘图区的宽度和高度分别由QWidget类的width和height方法获得。在这个坐标系中的坐标,称为视口(Viewport)坐标。相应地,还有另一套坐标系,其中的坐标称为窗口(Window)坐标。通过QPainter对象完成的所有绘制,都不会超出绘图区的范围。

26.1.3 QPainter的主要属性

借助QPainter对象,可以实现一些基本图形的绘制,如点、直线、圆形、矩形、曲线、文字等。控制这些图形元素的特性主要来自QPainter的以下三个属性:

这三个属性决定了所绘图形的基本特征。此外还有一些辅助属性,如叠加模式、旋转缩放等。

26.1.4 案例

26.1.4.1 创建项目

通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为Paint的项目。

26.1.4.2 添加资源

C:\Users\Minwei\Projects\Qt\Paint\Paint.qrc:

26.1.4.3 设计界面

C:\Users\Minwei\Projects\Qt\Paint\paintdialog.ui:

26.1.4.4 实现功能

C:\Users\Minwei\Projects\Qt\Paint\paintdialog.h:

C:\Users\Minwei\Projects\Qt\Paint\paintdialog.cpp:

26.1.4.5 测试验证

运行效果如图所示:

26.2 基本图形

26.2.1 绘制基本图形的方法

26.2.2 案例

26.2.2.1 创建项目

通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为Shape的项目。

26.2.2.2 设计界面

C:\Users\Minwei\Projects\Qt\Shape\shapedialog.ui:

26.2.2.3 实现功能

C:\Users\Minwei\Projects\Qt\Shape\shapedialog.h:

C:\Users\Minwei\Projects\Qt\Shape\shapedialog.cpp:

26.2.2.4 测试验证

运行效果如图所示:

26.3 复杂图形

26.3.1 QPainterPath

QPainter类除了提供上述绘制基本图形的方法外,还提供了一个名为drawPath的方法,用于绘制一些相对复杂的图形:

该方法的参数是一个对QPainterPath类型对象的引用。QPainterPath的妙处在于,它可以记录一系列参与复杂图形绘制的绘制动作。当将其作为参数交给QPainter类的drawPath方法时,这些绘制动作将被依次执行,最终完成复杂图形的绘制。此外,记录了绘制过程的QPainterPath对象还可以重复使用,比如在不同的位置,以不同的缩放比例和旋转角度,甚至以不同的扭曲形式,绘制相同的图形。

26.3.2 案例

26.3.2.1 创建项目

通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为Path的项目。

26.3.2.2 设计界面

C:\Users\Minwei\Projects\Qt\Path\pathdialog.ui:

26.3.2.3 实现功能

C:\Users\Minwei\Projects\Qt\Path\pathdialog.h:

C:\Users\Minwei\Projects\Qt\Path\pathdialog.cpp:

26.3.2.4 测试验证

运行效果如图所示: