Qt之圖形(QPainter的基本繪圖)


簡述

Qt中提供了強大的2D繪圖系統,可以使用相同的API在屏幕和繪圖設備上進行繪制,它主要基於QPainter、QPaintDevice和QPaintEngine這三個類。

  • QPainter用來執行繪圖操作,其提供的API在GUI或QImage、QOpenGLPaintDevice、QWidget和QPaintDevice顯示圖形(線、形狀、漸變等)、文本和圖像。

  • QPaintDevice不直接繪制物理顯示畫面,而利用邏輯界面的中間媒介。例如,繪制矩形圖形時,為了將對象繪制到QWidget、QGLPixelBuffer、QImage、QPixmap、QPicture等多種界面中間,必須使用QPaintDevice。

  • QPaintEngine提供了一些接口,可以用於QPainter在不同的設備上進行繪制。

繪圖系統由QPainter完成具體的繪制操作,QPainter類提供了大量高度優化的函數來完成GUI編程所需要的大部分繪制工作。它可以繪制一切想要的圖形,從最簡單的一條直線到其他任何復雜的圖形,例如:點、線、矩形、弧形、餅狀圖、多邊形、貝塞爾弧線等。此外,QPainter也支持一些高級特性,例如反走樣(針對文字和圖形邊緣)、像素混合、漸變填充和矢量路徑等,QPainter也支持線性變換,例如平移、旋轉、縮放。

QPainter可以在繼承自QPaintDevice類的任何對象上進行繪制操作。QPainter也可以與QPrinter一起使用來打印文件和創建PDF文檔。這意味着通常可以用相同的代碼在屏幕上顯示數據,也可以生成打印形式的報告。

QPainter一般在部件的繪圖事件paintEvent()中進行繪制,首先創建QPainter對象,然后進行圖形的繪制,最后記得銷毀QPainter對象。當窗口程序需要升級或者重新繪制時,調用此成員函數。使用repaint()和update()后,調用函數paintEvent()。

下面通過簡單的示例來介紹成員函數paintEvent()的使用方法。

繪制文本

效果

這里寫圖片描述

源碼

void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event);

    QPainter painter(this);
    // 設置畫筆顏色
    painter.setPen(QColor(0, 160, 230));

    // 設置字體:微軟雅黑、點大小50、斜體
    QFont font;
    font.setFamily("Microsoft YaHei");
    font.setPointSize(50);
    font.setItalic(true);
    painter.setFont(font);

    // 繪制文本
    painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

首先為該部件創建了一個QPainter對象,用於后面的繪制。使用setPen()來設置畫筆的顏色(淡藍色)。通過使用QFont來構建我們想要的字體,setFamily()設置字體為微軟雅黑、setPointSize()設置點大小30、setItalic()設置斜體, 然后通過setFont()來設置字體,最后調用drawText()來實現文本的繪制,這里的rect()是指當前窗體的顯示區域,Qt::AlignCenter指文本居中繪制。

繪制直線

效果

這里寫圖片描述

源碼

void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event);

    QPainter painter(this);
    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);
    // 設置畫筆顏色
    painter.setPen(QColor(0, 160, 230));
    // 繪制直線
    painter.drawLine(QPointF(0, height()), QPointF(width() / 2, height() / 2));
}

首先我們通過setRenderHint()來設置反走樣,要么繪制出來的線條會出現鋸齒,調用setPen()來設置畫筆顏色(淡藍色)。最后調用drawLine()來實現直線的繪制,其中QPointF(0, height())是指直線的起點坐標、QPointF(width() / 2, height() / 2)是指直線的終點坐標。

繪制矩形

效果

這里寫圖片描述

源碼

void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event);

    QPainter painter(this);

    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);
    // 設置畫筆顏色、寬度
    painter.setPen(QPen(QColor(0, 160, 230), 2));
    // 設置畫刷顏色
    painter.setBrush(QColor(255, 160, 90));
    painter.drawRect(50, 50, 160, 100);
}

首先我們使用setPen()來設置畫筆顏色(淡藍色)、寬度(2像素),用來設置矩形區域的邊框。然后使用setBrush()來設置畫刷顏色(橙色),用來填充矩形區域,最后調用drawRect()來實現矩形的繪制,其中參數依次順序為x、y、w、h,是指區域從x為50,y為50的坐標點起,寬度為160,高度為100的矩形。

繪制弧線

效果

這里寫圖片描述

源碼

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    // 矩形
    QRectF rect(90.0, 90.0, 80.0, 90.0);
    // 起始角度
    int startAngle = 30 * 16;
    // 跨越度數
    int spanAngle = 120 * 16;

    QPainter painter(this);

    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 設置畫筆顏色、寬度
    painter.setPen(QPen(QColor(0, 160, 230), 2));

    // 繪制弧線
    painter.drawArc(rect, startAngle, spanAngle);
}

畫弧線時,角度被分成了十六分之一,就是說,如果要30度,就需是30*16。它有起始角度和跨度,還有位置矩形,所以,要想畫出自己想要的弧線,就需要大概估算出各個參數的預估值。

繪制橢圓

效果

這里寫圖片描述

源碼

void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event);

    QPainter painter(this);

    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 設置畫筆顏色、寬度
    painter.setPen(QPen(QColor(0, 160, 230), 2));

    // 繪制橢圓
    painter.drawEllipse(QPointF(120, 60), 50, 20);

    // 設置畫刷顏色
    painter.setBrush(QColor(255, 160, 90));

    // 繪制圓
    painter.drawEllipse(QPointF(120, 140), 40, 40);
}

這里我們繪制了一個橢圓和一個圓形,都是調用drawEllipse接口,我們可以很輕易的發現,如果為橢圓的時候,后面兩個參數不一樣,圓形則相同。首先我們來看第一個參數QPointF是指橢圓的中心點相對當前窗體QPoint(0, 0)點的位置,后面的參數指橢圓的x軸及y軸的半徑。

繪制多邊形

效果

這里寫圖片描述

源碼

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 設置畫筆顏色
    painter.setPen(QColor(0, 160, 230));

    // 各個點的坐標
    static const QPointF points[4] = {QPointF(30, 40), QPointF(60, 150), QPointF(150, 160), QPointF(220, 100)};

    // 繪制多邊形
    painter.drawPolygon(points, 4);
}

首先我們頂一個個坐標點的位置,這里有四個點,分別為:QPointF(30, 40)、QPointF(60, 150)、QPointF(150, 160)、 QPointF(220, 100),然后調用drawPolygon將各個點連接起來,繪制為多邊形。

繪制圖片

效果

這里寫圖片描述

源碼

void MainWindow::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);

    // 反走樣
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 繪制圖標
    painter.drawPixmap(rect(), QPixmap(":/Images/logo"));
}

通過drawPixmap()來繪制圖片,我們可以指定圖片繪制的區域QRect,這里為整個界面的區域,當界面伸縮的時候,圖片也會跟着伸縮。

總結

基本的文本、直線、矩形、橢圓、多邊形、圖片的繪制已經分享完了,還有一些細節我們沒有講解,關於其它圖形的繪制也大同小異,這些我們都在后面做詳細的講解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM