QPainter類 詳解

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()在QPrinterQPicture上更快並且有時更好。

使用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時,一些平臺的行爲可能就不正確了。

請參考QPaintDeviceQWidgetQPixmapQPrinterQPicture應用程序預演座標系統概述圖像類圖像處理類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章