2008年7月10日 星期四

QT-chap 9

* t9/lcdrange.h包含LCDRange類別定義。
* t9/lcdrange.cpp包含LCDRange類別實現。
* t9/cannon.h包含CannonField類別定義。
* t9/cannon.cpp包含CannonField類別實現。
* t9/main.cpp包含MyWidget和main。

cannon.cpp有新增程式碼


void CannonField::paintEvent( QPaintEvent * )
{
  QPainter p( this );


我們要對畫布實作畫圖囉
We'll now start to use QPainter in earnest. We create a painter that operates on this widget.


p.setBrush( blue );

我們先設定顏料是藍色


p.setPen( NoPen );

* Qt::NoPen - 根本就沒有線。比如,QPainter::drawRect()填充但沒有繪製任何邊界線。
* Qt::SolidLine - 一個簡單的線。
* Qt::DashLine - 由一些像素分隔的短線。
* Qt::DotLine - 由一些像素分隔的點。
* Qt::DashDotLine - 輪流交替的點和短線。
* Qt::DashDotDotLine - 一個短線,兩個點,一個短線,兩個點。
* Qt::MPenStyle - 畫筆風格的掩碼。


p.translate( 0, rect().bottom() );


轉換座標:
因位座標最左上角是(0,0),x向下遞增、y向右遞增。
translate(40,100)表示點向右偏移40單位、向下偏移100單位
而x與y的方向還是沒有改變;x向右遞增、y向下遞增。
而rect().bottom()表示窗口元件的底邊的座標
而由(0,0)開始往右x分別為0,1,2,...
而由(0,0)開始往上y分別為0,-1,-2...

例如下面的程式是在同一個點上畫兩次


void MyWidget::paintEvent()
{
  QPainter paint( this );

  paint.drawPoint( 0, 0 );

  paint.translate( 100.0, 40.0 );
  paint.drawPoint( -100, -40 );
}



p.drawPie( QRect(-35, -35, 70, 70), 0, 90*16 );



上面表示在一個矩型畫出一個360度的餅型圖
drawPie()函數使用一個開始角度和弧長在一個指定的矩形內一個餅型圖
座標是表示矩型左上角相對於父元件的座標
角度的度量用的是一度的十六分之一。
零度在三點的位置。
畫的方向是順時針的。這裡我們在窗口部件的左下角畫一個四分之一圓。
這個餅圖被藍色充滿,並且沒有邊框。


p.rotate( -ang );

QPainter::rotate()函數繞QPainter坐標系統的初始座標(0,0)旋轉它
旋轉的參數是一個按度數給定的浮點數(不是一個像上面那樣給的十六分之一的度數)並且是順時針的。這裡我們順時針旋轉ang度數。


p.drawRect( QRect(33, -4, 15, 8) );

QPainter::drawRect()函數畫一個指定的矩形。這裡我們畫的是加農炮的炮筒。

在這種情況下,坐標系統先被轉化後被旋轉。如果矩形QRect(33, -4, 15, 8)被畫到這個轉化後的坐標系統中,它看起來會是這樣:


注意矩形被CannonField窗口部件的邊界省略了一部分。當我們選裝坐標系統,以60度為例,矩形會以(0,0)為圓心被旋轉,也就是左下角,因為我們已經轉化了坐標系統。結果會是這樣:



int main( int argc, char **argv )
{
  QApplication::setColorSpec( QApplication::CustomColor );
  QApplication a( argc, argv );

我們告訴Qt我們在這個程序中想使用一個不同的顏色分配策略。
這裡沒有單一正確的顏色分配策略。因為這個程序使用了不常用的黃色,但不是很多顏色,CustomColor最好。這裡有幾個其它的分配策略,你可以在QApplication::setColorSpec()文檔中讀到它們。

通常情況下你可以忽略這一點,因為默認的是好的。偶爾一些使用常用顏色的應用程序看起來比較糟糕,因而改變分配策略通常會有所幫助。

homework:
修改pen請參考這裡
而修改為Qu&it是表示快速鍵變成Alt+i

參考資料:第九章

沒有留言: