本章所介绍内容基本在《QT从入门到实战x篇》中对应有介绍,本专栏主要做简要功能介绍,到实际需要使用的时候再做详究。
Qt 的绘图系统使用户可以在屏幕或打印设备上用相同的 API绘图,绘图系统基于 QPainter、QPaintDevice和QPaintEngine
类。
QPainter 是用来进行绘图操作的类,QPaintDevice 是一个可以使用QPainter 进行绘图的抽象的二维界面,QPaintEngine 给 QPainter 提供在不同设备上绘图的接口。QPaintEngine 类由 QPainter 和QPaintDevice 内部使用,应用程序一般无需和 QPaintEngine 打交道,除非要创建自己的设备类型。
一般的绘图设备包括 QWidget、QPixmap、QImage 等,这些绘图设备为 QPainter 提供一个“画布”。
QWidget 类及其子类是最常用的绘图设备,从QWidget 类继承的类都有 paintEvent()事件
,要在设备上绘图,只需重定义此事件并编写响应代码。创建一个 QPainter 对象获取绘图设备的接口,然后就可以在绘图设备的“画布”上绘图了。
在paintEvent()事件里绘图的基本程序结构是:
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);//创建与绘图设备关联的QPainter对象
```//painter在设备的窗口上画图
}
首先创建一个属于本绘图设备的 QPainter 对象 painter,然后使用这个 painter 在绘图设备的窗口上画图。
QWidget 的绘图区就是其窗口内部区域。如图8-1所示是在一个 QWidget 窗口上绘制了一个填充矩形(这个实心矩形及其边框是程序绘制的图形,其他直线和文字是为说明而加的),整个窗口内部的矩形区就是QPainter 可以绘图的区域。
QWidget的内部绘图区的坐标系统如图8-1所示,坐标系统的单位是像素。左上角坐标为(0,0),向右是X 轴正方向,向下是 Y 轴正方向,绘图区的宽度由QWidget::width()函数获取,高度由 QWidget::height()函数获取,所以,绘图区右下角的的点的坐标是(width(),height())。这个坐标系统是 QWidget 绘图区的局部物理坐标,称为视口(viewport)坐标。相应的还有逻辑坐标,称为窗口 (window)坐标
,后面再详细介绍。
使用QPainter 在QWidget 上绘图就是在这样的一个矩形区域里绘图
用 QPainter 在绘图设备上绘图,主要是绘制一些基本的图形元素,包括点、直线、圆形、矩形、曲线、文字等,控制这些绘图元素特性的主要是 QPainter 的 3 个属性,分别如下。
pen 属性:是一个 QPen 对象,用于控制线条的颜色、宽度、线型等,如图 8-1 所示矩形边框的线条的特性就是由 pen 属性决定的。
brush 属性:是一个QBrush 对象,用于设置一个区域的填充特性,可以设置填充颜色、填充方式、渐变特性等,还可以采用图片做材质填充。图 8-1 中的矩形用黄色填充就是由 brush属性设置决定的。
font 属性:是一个 QFont 对象,用于绘制文字时,设置文字的字体样式、大小等属性。
使用这 3 个属性基本就控制了绘图的基本特点,当然还有一些其他的功能结合使用,比如叠加模式、旋转和缩放等功能。
关于QPainter基本功能实例,请参考书籍。
QPen 用于绘图时对线条进行设置,主要包括线宽、颜色、线型等,表 8-1是 QPen 类的主要接口函数。通常一个设置函数都有一个对应的读取函数,例如 setColor()用于设置画笔颜色,对应的读取画笔颜色的函数为 color(),表 8-1 仅列出设置函数(省略了函数参数中的 const 关键字)。
线条颜色和宽度的设置无需多说,,QPen影响线条特性的另外3 个主要属性是线条样式(style).
端点样式(capStyle) 和连接样式 (joinStyle)。具体如何影响见书籍。
QBrush 定义了QPainter 绘图时的填充特性,包括填充颜色、填充样式、材质填充时的材质图片等,其主要函数见表 8-2(省略了函数参数中的 const 关键字)。
setStyle(Qt::BrushStyle style)函数设置画刷的样式,参数是 Qt:BrushStyle style 枚举类型,该枚举类型典型的几种取值见表 8-3,详细的取值请参考Qt 的帮助文件。
使用渐变填充需要用渐变类的对象作为 Painter 的 brush,有3 个实现渐变填充的类。
QLinearGradient:线性渐变。指定一个起点及其颜色,终点及其颜色,还可以指定中间的某个点的颜色,起点至终点之间的颜色会线性插值计算,得到线性渐变的填充颜色。
QRadialGradient:有简单辐射渐变和扩展辐射渐变两种方式。简单辐射渐变是在一个圆内的一个焦点和一个端点之间生成渐变颜色,扩展辐射渐变是在一个焦点圆和一个中心圆之间生成渐变色。
QConicalGradient:圆锥形渐变,围绕一个中心点逆时针生成渐变颜色。
具体使用见书籍
QPainter 提供了很多绘制基本图形的功能,包括点、直线、椭圆、矩形、曲线等,由这些基本的图形可以构成复杂的图形。QPainter 中提供的绘制基本图元的函数见对应章节。每个函数基本上都有多种参数形式,这里只列出函数名,给出了其中一种参数形式的示例代码,并且假设已经通过以下的代码获得了绘图窗口的 painter、窗口宽度W和高度H。
QPainter painter(this);
int W=this->width); //绘图区宽度
int H=this->height); //绘图区高度
同一个函数名的其他参数形式的函数原型可查阅 Qt 的帮助文件。
QPainterPath 是一系列绘图操作的顺序集合,便于重复使用。一个 PainterPath 由许多基本的绘图操作组成,如绘图点移动、划线、画圆、画矩形等,一个闭合的 PainterPath 是终点和起点连接起来的绘图路径。使用QPainterPath 的优点是绘制某些复杂形状时只需创建一个PainterPath,然后调用 QPainter:drawPath()就可以重复使用。例如绘制一个复杂的星星图案需要多次调用 lineto()函数,定义一个QPainterPath 类型的变量 path 记录这些绘制过程,再调用drawPath(path)就可以完成星型图案的绘制。具体见参考书籍。