QT 繪畫Square Shapes & Round Shapes

本文內容翻譯原文來自《Foundations of Qt Development》第7章 DRAWING AND PRINTING,作者:Johan Thelin。

Square Shapes

你可以畫出像圖7-8那樣的方角矩形或圓角矩形。使用的方法所需參數可以是矩形QRect或者矩形左上角座標(x,y)再加上寬和高。這兩種方法分別是drawRectdrawRoundRect.

清單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):

  • drawArc畫一段弧 —— 圓的一部分。
  • drawChord畫圓形的一部分 —— 這一部分是封閉的,由弦和絃外的弧包圍。
  • drawPie畫餅圖 —— 橢圓的一部分。
  • 所有畫橢圓部分圖案的方法都需要一個矩形作爲參數(就像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 );

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