- 論壇徽章:
- 0
|
要在繪圖設(shè)備(paint device,一般是一個控件)上開始繪制,我們只要創(chuàng)建一個QPainter,把繪圖設(shè)備指針傳給QPainter對象。例如:
oid MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
...
}
使用QPainter的draw…()函數(shù)我們可以繪制各種圖形。圖8.1給出了主要的一些。繪制的方式由QPainter的設(shè)置決定。設(shè)置的一部分是從繪圖設(shè)備得到的,其他是初始化時的默認值。三個主要的設(shè)置為:畫筆,刷子和字體。
畫筆用來繪制直線和圖形的邊框。包含顏色,寬度,線型,角設(shè)置和連接設(shè)置。
刷子是填充幾何圖形的方式。包含顏色,方式設(shè)置,也可以是一個位圖或者漸變色。
字體用來繪制文本。字體的屬性很多,如字體名,字號等。
這些設(shè)置隨時可以改變,可用QPen,QBrush,QFont對象調(diào)用setPen(),setBrush(),setFont()修改。
Figure 8.1. QPainter's most frequently used draw...() functions
Figure 8.2. Cap and join styles
Figure 8.3. Pen styles
Figure 8.4. Predefined brush styles
現(xiàn)在來看看具體的例子。下面的代碼是繪制圖8.5(a)中橢圓的代碼:
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
painter.drawEllipse(80, 80, 400, 240);
調(diào)用函數(shù)setRenderHint(QPainter::Antialiasing,true),使繪制時邊緣平滑,使用顏色濃度的變化,把圖形的邊緣轉(zhuǎn)換為象素時引起的扭曲變形盡可能減少,在支持這一功能的平臺或者繪圖設(shè)備上得到一個平滑的邊緣。
Figure 8.5. Geometric shape examples
下面的代碼是圖8.5(b)中繪制扇形的代碼:
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 15, Qt::SolidLine, Qt::RoundCap,
Qt::MiterJoin));
painter.setBrush(QBrush(Qt::blue, Qt::DiagCrossPattern));
painter.drawPie(80, 80, 400, 240, 60 * 16, 270 * 16);
函數(shù)drawPie()的最后兩個參數(shù)值的單位為一度的十六分之一。
下面的代碼是圖8.5(c)中繪制貝賽爾曲線的代碼:
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
QPainterPath path;
path.moveTo(80, 320);
path.cubicTo(200, 80, 320, 80, 480, 320);
painter.setPen(QPen(Qt::black, 8));
painter.drawPath(path);
通過連接基本圖形元素,直線,橢圓,多段線,圓弧,二次和三次貝塞爾曲線等,QPainterPath類能確定任何矢量圖形。因此,繪圖路徑(Painter paths)是最基本的繪制元素,任何圖形和圖形的組合都可以同路徑(path)表示。
一個路徑能夠確定一個輪廓,由這個輪廓確定的區(qū)域可以由刷子來填充。在圖8.5(c)中我們沒有設(shè)置刷子,因此只繪制了輪廓。
以上的三個例子都是使用了默認的刷子(Qt::SolidePattern,Qt::DiagCrossPattern,Qt::NoBrush)。在現(xiàn)在的應(yīng)用程序中,單色填充已經(jīng)很少使用,漸變色填充開始收到歡迎。漸變是依靠顏色的變化實現(xiàn)兩種或者多種顏色之間平滑的過渡。漸變通常用來處理3D效果,如使用Plastique漸變方式來表現(xiàn)QPushButtons。
Qt支持三種類型的漸變:線形漸變,圓錐漸變和圓形漸變(linear, conical, and radial)。下一節(jié)的OvenTimer例子就是在一個控件中使用了所有這三種漸變。
線形漸變由兩個控制點和直線上的一系列顏色點組成。圖8.6由下面的代碼得到:在兩個控制點之間,在三個不同的位置確定了三個不同的顏色值。位置有0到1的浮點數(shù)得到,0為第一個控制點,1為第二個控制點。不同位置點之間的顏色由差值計算得到。
LinearGradient gradient(50, 100, 300, 350);
gradient.setColorAt(0.0, Qt::white);
gradient.setColorAt(0.2, Qt::green);
gradient.setColorAt(1.0, Qt::black);
Figure 8.6. QPainter's gradient brushes
圓形漸變由顏色組,圓心(xc,yc),半徑r和焦點(xf,yf)定義。圓心和半徑定義一個圓,顏色從焦點開始擴散到周圍,焦點可以是圓心也可以是圓內(nèi)的任意一個點。
圓錐漸變由圓心(xc,yc)和一個角度a定義。顏色從圓心開始像表的秒針一樣擴散。
我們已經(jīng)提到了QPainter的畫筆,刷子和字體設(shè)置。此外,QPainter還有其他一些設(shè)置影響圖形和文字的繪制:
1. 背景刷子,當背景模式為Qt::OpaqueMode(缺省值為Qt::transparentMode)時,背景刷子用來填充幾何圖形,文字,和位圖的背景(在繪圖刷子的下面)
2. 刷子的起點:刷子的起始繪制點,通常為控件的左上角。
3. 剪輯區(qū)域,剪輯區(qū)域為繪圖設(shè)備上可以繪制的區(qū)域,在剪輯區(qū)域意外進行的繪制是無效的。
4. 視口,窗口,世界坐標:這三個決定了QPainter的邏輯坐標映射到物理坐標的方式。通常,邏輯坐標和物理坐標是重合的。坐標系統(tǒng)在下一節(jié)介紹。
5. 組合方式:組合方式?jīng)Q定繪制設(shè)備上新繪制的象素和已經(jīng)存在的象素的影響方式。缺省方式為覆蓋式(source over),新象素畫在已有元素的上面。只是有限一個繪圖設(shè)備支持組合方式的設(shè)置,將在本章后面介紹
在任何時候,我們可以調(diào)用save()把QPainter當前的設(shè)置保存在一個內(nèi)部棧里,然后調(diào)用restore()進行恢復(fù)。我們能夠臨時改變QPainter的一些設(shè)置,然后恢復(fù)先前的值。
本文來自CSDN博客,轉(zhuǎn)載請標明出處:
http://blog.csdn.net/iamdbl/archive/2007/05/29/1630129.aspx
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u3/94311/showart_2065571.html |
|