QPainter类 详解

http://www.kuqin.com/qtdocument/qpainter.html
QPainter类低水平的绘制,例如在窗口部件上。

绘制工具为做到绝大部分绘制图形用户界面程序的需要提供了高度优化的函数。QPainter可以绘制从简单的直线到像饼图和弦这样的复杂形状。它也可以绘制排列的文本和像素映射。通常,它在一个“自然的”坐标系统中绘制,但是它也可以在视和世界转换中做到这些。

绘图工具的典型用法是:

  • 构造一个绘图工具。
  • 设置画笔、画刷等等。
  • 绘制。
  • 销毁这个绘图工具。

绝大多数情况下,所有这些是在一个绘制事件中完成的。(实际上,99%的QPainter使用是在QWidget::paintEvent()的重新实现中,并且绘制工具已经为这种用法高度优化了。)这里是一个非常简单的实例:

    void SimpleExampleWidget::paintEvent()
    {
        QPainter paint( this );
        paint.setPen( Qt::blue );
        paint.drawText( rect(), AlignCenter, "The Text" );
    }
    

使用方法很简单并且这里有你可以使用的许多设置:

  • font()是当前设置的字体。如果你设置一个不可用的字体,Qt会找到一个相近的匹配。实际上,font()返回你使用setFont() 所设置的东西并且fontInfo()返回你实际使用的字体(这也许是相同的)。
  • brush()是当前设置的画刷,用来填充例如圆的颜色或者调色板。
  • pen()是当前设置的画笔,用来画线或者边缘的颜色或者点画。
  • backgroundMode()是Opaque或者Transparent,也就是是不是使用backgroundColor()。
  • 仅仅当backgroundMode()为Opaque并且pen()是一个点画的时候backgroundColor()才适用,它描述了在点画中背景像素的颜色。
  • rasterOp()是像素绘制和已经存在的像素是如何相互作用的。
  • brushOrigin()是平铺的画刷的原点,通常是窗口的原点。
  • viewport()、window()、worldMatrix()和很多其它的构成了绘制工具的坐标转换系统。关于这个的解释请参考坐标系统或者参考下面有关这些函数的非常简要的概述。
  • clipping()是指绘制工具是否裁剪。(绘制设备也裁剪。)如果绘制工具裁剪,它裁剪到clipRegion()。
  • pos()是当前位置,通过moveTo()设置并且通过lineTo()使用。

注意这些设置中的一些会镜像到一些绘制设备的设置中,例如QWidget::font()。QPainter::begin()(或者QPainter的构造函数)从绘制设备中复制这些属性。调用,例如QWidget::setFont()直到绘制工具开始在它上面绘制才会生效。

把所有的这些设置保存到内部栈中,restore()把它们弹出来。

QPainter的核心功能是绘制,并且这里有最简单的绘制函数:drawPoint()、drawPoints()、drawLine()、drawRect()、drawWinFocusRect()、drawRoundRect()、drawEllipse()、drawArc()、drawPie()、drawChord()、drawLineSegments()、drawPolyline()、drawPolygon()、drawConvexPolygon()和drawCubicBezier()。所有这些函数使用整数坐标,它们没有浮点数的版本,因为我们想使绘制尽可能快地进行。

这里有绘制像素映射/图像的函数,名为drawPixmap()、drawImage()和drawTiledPixmap()。drawPixmap()和drawImage()产生同样的结果,除了drawPixmap()在屏幕上更快一些并且drawImage()在QPrinter和QPicture上更快并且有时更好。

使用drawText()可以完成文本绘制,并且当你需要良好的定位,boundingRect()告诉你哪里是给定的drawText()命令将要绘制的。

这里有一个drawPicture()函数,用来使用这个绘制工具绘制整个QPicture的内容。drawPicture()是唯一忽视所有绘制工具设置的函数:QPicture有它自己的设置。

通常,QPainter在设备自己的坐标系统(通常是像素)上操作,但是QPainter也很好地支持坐标转换。关于更通用的概述和简单实例请参考坐标系统。

最常用到的函数是scale()、rotate()、translate()和shear(),所有这些在worldMatrix()上操作。setWorldMatrix()可以替换或者添加到当前设置的worldMatrix()。

setViewport()设置QPainter操作的矩形。默认是整个设备,这通常就很好了,除了在打印机上。setWindow()设置坐标系统,它是被映射到viewport()的矩形。在window()中绘制的东西最终会在viewport()中。窗口的默认就是和视口一样,并且如果你没有使用转换,它们会被优化,赢得一点点速度。

在所有坐标转换完成之后,QPainter能够把绘制裁剪到一个任意的矩形或者区域。如果QPainter裁剪了,hasClipping()为真并且clipRegion()返回裁剪区域。你可以使用setClipRegion()或setClipRect()来设置它。注意裁剪是很慢的。它是完全依赖系统的,但是单凭经验的方法,你可以假设绘制的速度与裁剪区域中的矩形数量成反比。

在QPainter的裁剪之后,绘制设备也可以被裁剪。例如,绝大多数窗口部件按子窗口部件的像素裁剪并且绝大多数打印机按接近纸的边缘裁剪。这些另外的裁剪不会受clipRegion()或hasClipping()的返回值影响。

QPainter也包括一些比较少用到的函数,它们在当它们被需要的时候是非常有用的。

isActive()指出绘制工具是否是激活的。begin()(和最常用的构造函数)使它激活。end()(和析构函数)释放它们。如果绘制工具是激活的,device()返回绘制工具在哪个绘制设备上绘制。

有时让其它什么在一个不平常的QPaintDevice上绘制是人们想要的。QPainter支持一个静态函数来做这些,redirect()。我们建议不要使用它,但是对于一些老手这是完美的。

setTabStops()和setTabArray()可以改变tab在哪里停止,但是它们极少被用到。

警告:注意QPainter不会试图在底层窗口系统的左边限制周围工作。坐标在+/-4000时,一些平台的行为可能就不正确了。

请参考QPaintDevice、QWidget、QPixmap、QPrinter、QPicture、应用程序预演、坐标系统概述、图像类和图像处理类。

你可能感兴趣的:(QPainter)