.tutorials/tutorial/t9/cannonfield.h
.tutorials/tutorial/t9/lcdrange.cpp
.tutorials/tutorial/t9/lcdrange.h
.tutorials/tutorial/t9/main.cpp
.tutorials/tutorial/t9/t9.pro
在這個範例我們來畫一個可愛的藍色小加農砲。只有 cannonfield.cpp 不同於先前的章節。
Line by Line Walkthrough
t9/cannonfield.cpp
void CannonField::paintEvent(QPaintEvent * /* event */) { QPainter painter(this);
我們要開始認真地使用 QPainter 了。我們建立了一個操作這個元件的繪圖工具(painter)。
painter.setPen(Qt::NoPen);
QPainter 所繪的邊緣(edge)是使用畫筆(pen)畫出來的。這裡我們將之設成 Qt::NoPen,代表我們在畫出某些東西時,將不會有一個明確的邊。
painter.setBrush(Qt::blue);
當 QPainter 填滿一個矩形、圓形、或是其他任何東西,它會使用它的筆刷(brush)來填滿圖形。這裡我們將它設成使用純藍色筆刷。(我們也可以使用調色盤。)藍色筆刷將會填滿所有我們畫出來的東西的邊緣內部。
painter.translate(0, rect().height());
QPainter::translate() 函式轉化(translate)了 QPainter 的座標系統(換言之,就是藉由偏移量[offset]移動)。這裡我們將元件的左下角設為(0, 0),x 與 y 的方向仍然沒有改變。也就是說,現在所有在這個元件之內的 y 坐標都是負的。(關於 Qt 的座標系統的更多資訊請參見 The Coordinate System。)
painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16);
QPainter::drawPie() 函式使用一個起始角度以及弧長,在特定的矩形中畫一個圓餅的形狀。角度的單位是 16 分之一度。零度在三點鐘方向。畫的方向為逆時鐘。這裡我們在元件的左下角畫了一個四分之一的圓。這個圓餅被藍色填滿,而且沒有邊框。
painter.rotate(-currentAngle);
QPainter::rotate() 函式繞著 QPainter 的原點旋轉(rotate)座標系統。旋轉引數是一個由度數(不是上面所說的 16 分之一度)給定的浮點數(float),並且是順時鐘的。這裡我們順時鐘旋轉了 currentAngle 度。
painter.drawRect(QRect(30, -5, 20, 10));
QPainter::drawRect() 函式畫出一個特定的矩形。這裡我們畫出加農砲的砲管。
當座標系統像上面這樣被轉換(轉化、旋轉、縮放[scale]、或是修剪[shear]),常常很難去想像畫出來的結果。
在這個例子中,坐標系統先被轉化再被旋轉。若是矩形 QRect(30, -5, 20, 10) 被畫在這個轉換後的座標系統,它看起來會像這樣:
注意矩形被 CannonField 元件的邊界修剪了一部份。當我們旋轉座標系統,舉 60 度為例,矩形將會繞著 (0, 0)--也就是左下角,因為我們轉化了座標系統--被旋轉。結果看起來像這樣:
Running the Application
當滾動軸被操作時,畫出來的加農砲角度也會跟著改變。
Quit 按紐的 'Q' 現在有條底線,而且 Alt+Q 會按下這個按鈕。
Exercises
設定一支不同的畫筆代替 Qt::NoPen。設定一支調色盤的筆刷。
試著將按鈕上的文字改成 "Q&uit" 或是 "Qu&it" 來代替 "&Quit"。發生了什麼事?
來源:Qt Tutorial 9 - With Cannon You Can
版本:4.4.3
0 回覆:
張貼留言