Qt繪圖原理詳解

qt高級進階 發佈 2024-05-09T11:48:27.740943+00:00

1、Qt繪製事件當應用程式收到繪製事件時,就會調用​QWidget::paintEvent()​​,該函數就是繪製窗口的地方。

1、QT繪製事件

當應用程式收到繪製事件時,就會調用​QWidget::paintEvent()​​,該函數就是繪製窗口的地方。

有兩種方法要求重繪一個窗口

​​update()​​ --把重繪事件添加到事件隊列中

重複調用​​update()​​會被Qt合併為一次

不會產生圖像的閃爍

可帶參數指定重繪某個區域

​​repaint()​​ --立即產生繪製事件

一般情況下不推薦使用此方法

只使用在需要立即重繪的特效情況下

可帶參數指定重繪某個區域

為了處理繪製事件,只需要重寫​​paintEvent()​​​函數,並在該函數中實例化一個​​QPainter​​對象進行繪製。

class MyWidget : public QWidget
{
    ...
protected:
    void paintEvent(QPaintEvent *);
}

void MyWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    ...
}
    QT開發交流+貲料君羊:714620761

基本繪製

​​QPainter​​類提供繪製操作,其構造函數原型為:

QPainter(QPaintDevice *device);

​QPaintDevice​​代表繪製2D圖像的畫布;

如下繼承​​QPaintDevice​​的類對象都可用於​​QPainter​​繪製

QWidget、QImage、QPixmap、QPicture、QPrinter、QSvgGenerator、
QGLPixelBuffer、QGLFrameBufferObject

2、Qt 2D繪圖

QPainter

線和輪廓都可以用畫筆(QPen)進行繪製,用畫刷(QBrush)進行填充;

字體使用​​QFont​​類定義,當繪製文字時,Qt使用指定字體的屬性,如果沒有匹配的字體,Qt將使用最接近的字體;

通常情況下,​​QPainter​​​以默認的坐標系統進行繪製,也可以用​​QMatrix​​類對坐標進行變換;

當繪製是,可以使用​​QPainter::RenderHint​​來告訴繪圖引擎是否棄用反鋸齒功能使圖變得平滑;

​​QPainter::RenderHint​​的可取值:

​​QPainter::Antialiasing​​:告訴繪圖引擎應該在可能的情況下進行邊的反鋸齒繪製

​​QPainter::TextAntialiasing​​:儘可能的情況下文字的反鋸齒繪製

​​QPainter::SmoothPixmapTransform​​:使用平滑的pixmap變換算法(雙線性插值算法),而不是近鄰插值算法;

QPainter的繪圖函數總結如下:

3、畫筆

畫筆的屬性包括線型、線寬、顏色等。畫筆屬性可以在構造函數中指定,也可以使用​​setStyle()​​​,​​setWidth()​​​,​​setBrush()​​​,​​setCapStyle()​​​,​​setJoinStyle()​​等函數設定;

Qt中,使用Qt::PenStyle定義了6中畫筆風格,分別是:

​ 還可以自定義線風格(​​Qt::CustomDashLine​​​),需要使用QPen的​​setDashPattern()​​函數來設定自定義風格。

端點風格(cap style)

端點風格決定了線的端點樣式,只對線寬大於1的線有效。

Qt定義了三種端點風格用枚舉類型​​Qt::PenCapStyle​​表示,分別為:

連接風格(join style)

連接風格是兩條線如何連接,連接風格對線寬大於等於1的線有效;

Qt定義了四種連接方式,用枚舉類型​​Qt::PenStyle​​表示。分別是:


4、畫刷

在Qt中圖形使用​​QBrush​​進行填充,畫刷包括填充顏色和風格(填充模式)。

在Qt中,顏色使用​​QColor​​​類表示,​​QColor​​支持RGB、HSV、CMYK顏色模型。QColor還支持alpha混合的輪廓和填充。

RGB是面向硬體的模型。顏色有紅綠藍三種基色混合而成。

HSV/HSL模型比較符合人對顏色的感覺,由色調(0-359),飽和度(0-255),亮度(0-255)組成,主要用於顏色選擇器。

CMYK由青、洋紅、黃、黑四種基色組成。主要用於印表機等硬體拷貝設備上。每個顏色分量的取值是0-255。

基本模式填充包括有各種點、線組合的模式。

QColor

​​QColor​​​的構造函數:​​QColor(int r,int g,int b,int a)​​

其中 參數a(alpha)是控制透明度的,取值範圍為0-255;0為完全透明,255為不透明。

顏色還可以使用如下函數進行微調

QColor::lighter(int factor)
QColor::darker(int factor)

QRgb

QRgb類可以用於保存顏色值,可與QColor相互轉換獲取32-bit的RGB顏色值+alpha值。

創建新顏色

QRgb orange = qRgb(255,127,0);
QRgb overlay = qRgb(255,0,0,100);

獲取單獨某個顏色值:qRed,qGreen,qBlue,qAlpha

int red = qRed(orange);

獲取灰度值

int gray = qGray(orange);

模式畫刷

模式化畫刷構造函數​​QBrush(const QColor *color,Qt::BrushStyle style)​​,具體見下圖:

5、漸變填充

Qt提供了漸變填充的畫刷,漸變填充包括兩個要素:顏色的變化和路徑的變化

顏色變化可以指定從一種顏色漸變到另外一種顏色。

路徑變化指在路徑上指定一些點的顏色進行分段漸變。

Qt中,提供了三種漸變填充

線性(QLinearGradient)

圓形(QRadialGradient)

圓錐漸變(QConicalGradient)

所有的類都從QGradient類繼承

構造漸變填充的畫刷

QBrush b = QBrush(QRadialGradient(...));

填充設置

從圖形的起點到終點,以從0至1的比例漸變填充

QGradient::setColorAt(qreal pos,QColor color);

完成0-1範圍的填充後,後續顏色鋪開的方式可以不同,通過​​setSpread()​​函數來設置

1、線性漸變填充

線性漸變填充指定兩個控制點,畫刷在兩個控制點之間進行顏色插值。

通過創建​​QLinearGradient​​對象來設置畫刷。

QPainter painter(this);
QLinearGradient g(0,0,100,100);
g.setColorAt(0.0,Qt::white);
g.setColorAt(1.0,Qt::blue);
painter.setBrush(g);
p.drawRect(0,0,100,100);

在​​QGradient​​構造函數中指定線性填充的兩點分別為(0,0),(100,100)。

​​setColorAt()​​函數在0-1之間設置指定位置的顏色。

2、圓形漸變填充

圓形漸變填充需要指定圓心、半徑和焦點

QRadialGradient(qreal cx,qreal cy,qreal radius,qreal fx,qreal fy);

畫刷在焦點和圓上的所有點之間進行顏色插值。

創建​​QRadialGradient​​對象設置畫刷

QPainter painter(this);
QRadialGradient radialGradient(50,50,50,30,30);
radialGradient.setColorAt(0.0,Qt::white);
radialGradient.setColorAt(1.0,Qt::blue);
painter.setBrush(radialGradient);
painter.drawRect(0,0,100,100);

3、圓錐漸變填充

圓錐漸變填充指定圓形和開始角

QConicalGradient(qreal cx,qreal cy,qreal angle);

畫刷沿圓心逆時針對顏色進行插值

創建​​QConicalGradient​​對象並設置畫刷

QPainter painter(this);
QConicalGradient conicalGradient(50,50,90);
conicalGradient.setColorAt(0,Qt::white);
conicalGradient.setColorAt(1,Qt::blue);
painter.setBrush(conicalGradient);
painter.drawRect(0,0,100,100);

為了實現自定義填充,還可以使用QPixmap或者QImage對象進行紋理填充。兩種圖像分別使用​​setTexture()​​和​​setTextureImage()​​函數加載紋理。

關鍵字: