本文內容翻譯原文來自《Foundations of Qt Development》第7章 DRAWING AND PRINTING,作者:Johan Thelin。
Square Shapes
你可以畫出像圖7-8那樣的方角矩形或圓角矩形。使用的方法所需參數可以是矩形QRect或者矩形左上角座標(x,y)再加上寬和高。這兩種方法分別是drawRect
和drawRoundRect
.
清單7-5展示了怎樣畫方角矩形和圓角矩形。前兩種方法直接用座標繪畫,座標用x, y, w, h來表示,其中x, y表示左上角頂點位置,w, h表示矩形的寬和高。
注意:如果寬或高小於0,那麼x,y表示的頂點不是矩形的左上角。
後兩個矩形依據給出的QRect參數繪畫,該參數保存有矩形的座標值。在drawRoundRect函數調用中,矩形參數rect被直接使用,而在drawRect函數調用中,使用了rect下移45個像素的新矩形。這是使用translated(int x, int y)
實現的,translated方法返回了一個同等大小,但位置發生相對移動的矩形,移動的方向和距離由向量(x,y)指明。
繪畫的結果在圖片7-9中。
Listing 7-5.在pixmap中畫矩形
QPixmap pixmap( 200, 100 );
pixmap.fill( Qt::white );
QPainter painter( &pixmap );
painter.setPen( Qt::black );
painter.drawRect( 10, 10, 85, 35 );
painter.drawRoundRect( 10, 55, 85, 35 );
QRect rect( 105, 10, 85, 35 );
painter.drawRoundRect( rect );
painter.drawRect( rect.translated( 0, 45 ) );
void Rect::paintEvent(QPaintEvent *event)
{
QPainter painter( this );
painter.setPen( Qt::black );
painter.drawRect( 10, 10, 85, 35 );
painter.drawRoundRect( 10, 55, 85, 35 );
QRect rect( 105, 10, 85, 35 );
painter.drawRoundRect( rect );
painter.drawRect( rect.translated( 0, 45 ) );
}
Round Shapes
圓和橢圓都可以使用drawEllipse方法畫出(見圖7-10)。該方法需要矩形或(x, y, w, h)作爲參數(就像畫矩形一樣)。爲了畫出一個圓,你需要確保寬度和高度是等值的。
畫橢圓很有趣,因爲你可以僅僅畫整個圖案的一部分。Qt可以畫三個部分(見圖7-11):
所有畫橢圓部分圖案的方法都需要一個矩形作爲參數(就像drawEllipse方法)。然後這些方法需要一個開始的角度以及所畫部分佔整個橢圓的跨度。該角度值和跨度用整數表示,是一個度的16分之1,這意味着5760個單位是一個完整的圓。0度指向3點鐘的方向,跨度爲正向代表着逆時針方向。
清單7-6展示了怎樣畫橢圓和弧(結果顯示在圖7-12)。就像你看到的,圖案的比例發生了變化,最右邊的橢圓與弧是圓與圓的一部分(外圍矩形的寬等於高)。
如同代碼展示的那樣,可以通過座標或QRect指明橢圓和弧所在的外圍矩形。
給出QT度數時,我使用了16的倍數將實際的度數改裝成QT所期望的整數。
Listing 7-6 畫橢圓與弧
QPixmap pixmap( 200, 190 );
pixmap.fill( Qt::white );
QPainter painter( &pixmap );
painter.setPen( Qt::black );
painter.drawEllipse( 10, 10, 10, 80 );
painter.drawEllipse( 30, 10, 20, 80 );
painter.drawEllipse( 60, 10, 40, 80 );
painter.drawEllipse( QRect( 110, 10, 80, 80 ) );
painter.drawArc( 10, 100, 10, 80, 30*16, 240*16 );
painter.drawArc( 30, 100, 20, 80, 45*16, 200*16 );
painter.drawArc( 60, 100, 40, 80, 60*16, 160*16 );
painter.drawArc( QRect( 110, 100, 80, 80 ), 75*16, 120*16 );