Qt的绘图系统

来源:互联网 发布:switch case c语言 编辑:程序博客网 时间:2024/04/28 22:33


Qt的绘图系统由三部分构成(三个类):

1、QPainter:提供了绘图的操作,用户通常使用该类完成绘图操作。

2、QPaintEngine:它提供了一个抽象的接口,painter使用这个接口可以在不同的设备上绘图。

3、QPaintDevice:对绘图设备的抽象,表示一个二维空间,QPainter可以在其上绘图。它的子类包括QWidget, QPixmap, Qpicture, QImage和QPrinter,代表具体的绘图设备。

          

程序员通常不会直接使用QPainEngine绘图,而是由QPainter和QDevice内部使用QPaintEngine。这样做的主要好处是所有绘图操作都遵循相同的过程,也很容易添加对新特性的支持。


QPaintDevice代表的是要在其上绘图的设备,需要一套坐标系统描述绘图发生的位置。默认情况下,设备的坐标原点位于左上角,x轴向左增长,y轴向下增长。在基于像素的设备上,默认单位是像素;在打印机上,默认单位是点(1/72英寸)。

绘图操作通常是用QPainter在逻辑坐标下完成的,因此需要将逻辑坐标映射为QPaintDevice的物理坐标。坐标映射是由QPainter的坐标变换矩阵、视口(viewport)和窗口(window)完成的。默认情况下,逻辑坐标和物理坐标是一致的。


窗口-视口坐标转换(Window-Viewport Conversion)

在Qt中,viewport通过指定矩阵表示画图设备的物理坐标,window用逻辑坐标表示相同的矩阵。默认情况下,逻辑坐标和物理坐标是一致的,都等于画图设备代表的矩形。通过window-viewport转换,可以使用逻辑坐标来完成绘图,而不用考虑具体的绘图设备。例如,可以设置画图区域(viewport)的逻辑坐标为(-50,-50,50,50),其原点坐标为(0,0),

QPainter painter(this);painter.setWindow(QRect(-50, -50, 100, 100))

现在,逻辑坐标(-50,-50)对应于物理坐标(视口坐标)(0,0)。与物理坐标无关,画图操作总是根据逻辑坐标。


Window矩阵的每个点总是映射到viewport矩阵对应的点上。因此,viewport与window保持相同的宽高比,可以在window-viewport转换时保持图形不变形。例如,

int side = qMin(width(), height()) int x = (width() - side / 2); int y = (height() - side / 2); painter.setViewport(x, y, side, side);
window为正方形,viewport也设置为正方形,避免了变形。

坐标变换

QPainter支持仿射变换。QPainter可以用两种方式执行坐标变换:1)使用QPainter的成员函数,如scale(), shear()等;2)使用QTransform类,QTransform是3×3的矩阵,支持透视变换(perspective transformation)。实际上,QPainter的所有坐标变换操作都是通过设置QTransform完成的,可以使用QPainter::worldTransform()函数QPainter当前的坐标变换矩阵。如果需要重复使用某一坐标变换,可以通过QPainter::worldTransform()和QPainter::setWorldTransform()设置坐标变换矩阵。也可以使用QPainter::save()

将变换矩阵保存在内部栈中,使用QPainter::restore()弹出变换矩阵。


坐标转换过程

viewport、window和坐标变换矩阵共同确定了如何将QPainter的逻辑坐标映射为设备的物理坐标,即先使用坐标变换矩阵将逻辑坐标转换为window坐标,再将通过window-viewport坐标转换将windows坐标转换为设备的物理坐标。


参考文献:

http://qt-project.org/doc/qt-4.8/paintsystem.html

http://qt-project.org/doc/qt-4.8/coordsys.html

0 0