天天看點

Qt學習:QPainter之漸變填充

        前面說了有關反走樣的相關知識,下面來說一下漸變。漸變是繪圖中很常見的一種功能,它是利用顔色插值使得兩個或更多顔色之間能夠平滑過渡,簡單來說就是可以把幾種顔色混合在一起,讓它們能夠自然地過渡,而不是一下子變成另一種顔色。它們常被用來建立二維圖形的三維效果。漸變的算法比較複雜,寫得不好的話效率會很低,好在很多繪圖系統都内置了漸變的功能,Qt也不例外。漸變一般是用在填充裡面的,是以,漸變的設定就是在QBrush裡面。

        Qt支援三種類型的漸變,分别是線性漸變(QLinearGradient)、輻射漸變(QRadialGradient)、錐形漸變(QConicalGradient)。

        1、線性漸變由兩個控制點定義,連接配接這兩點的線上設定一系列的顔色斷點。這些斷點被鉗位到浮點數0和1之間,0對應第一個控制點,1對應第二個控制點,兩個指定斷點之間的顔色由線性插值得出。如代碼(以下給出paintEvent()函數裡面的代碼):

void MyWidget::paintEvent(QPaintEvent *event)
{
 QPainter painter(this);
 painter.setRenderHint(QPainter::Antialiasing, true);

 QLinearGradient linearGradient(60, 50, 200, 200); 
 linearGradient.setColorAt(0.2, Qt::white); 
 linearGradient.setColorAt(0.6, Qt::green); 
 linearGradient.setColorAt(1.0, Qt::black); 
 painter.setBrush(QBrush(linearGradient)); 
 painter.drawEllipse(50, 50, 200, 150);
}      

        這裡0對應第一個控制點(60,50),1對應第二個控制點(200,200),之間用了三個顔色插值,效果如下圖:

Qt學習:QPainter之漸變填充

    2、輻射漸變由一個中心點、半徑、一個焦點,以及顔色斷點控制。中心點和半徑定義一個圓。顔色從焦點向外擴散,焦點可以是中心點或者圓内的其他點。代碼如下:

void MyWidget::paintEvent(QPaintEvent *event)
{
 QPainter painter(this);
 painter.setRenderHint(QPainter::Antialiasing, true);

 QRadialGradient radialGradient(130, 130, 100, 130, 130);
 radialGradient.setColorAt(0.0, Qt::white);
 radialGradient.setColorAt(0.6, Qt::black);
 radialGradient.setColorAt(0.8, Qt::green);
 painter.setBrush(QBrush(radialGradient));
 painter.drawEllipse(50, 50, 200, 150);
}      

        這裡QRadialGradient radialGradient(130, 130, 100, 130, 130);中前兩個參數指定了中心點,第三個參數指定了半徑,後兩個參數指定了焦點,這裡中心點和焦點是同一個點,是以看起來效果是從中心點向外均勻擴散。效果如下:

Qt學習:QPainter之漸變填充

        3、錐形漸變由一個中心點和一個角度定義,顔色從x軸正向偏轉一個角度開始,按給定顔色斷點旋轉擴散。代碼如下:

void MyWidget::paintEvent(QPaintEvent *event)
{
 QPainter painter(this);
 painter.setRenderHint(QPainter::Antialiasing, true);

 QConicalGradient conicalGradient(150,150, 90);
 conicalGradient.setColorAt(0.2, Qt::white);
 conicalGradient.setColorAt(0.6, Qt::green);
 conicalGradient.setColorAt(0.8, Qt::black);
 painter.setBrush(QBrush(conicalGradient));
 painter.drawEllipse(50, 50, 200, 150);
}      

        這裡定義(150,150)為中心點,從x軸正向開始偏轉90度,然後按白綠黑旋轉擴撒,效果如下:

Qt學習:QPainter之漸變填充

        4、那麼我們如何控制我們的線條也是漸變效果呢 ? 通常我們畫線是用畫筆來完成的,但是QPen是接收QBrush做參數的,也就是說,你可以利用一個QBrush建立一個QPen,這樣,QBrush所有的填充效果都可以用在畫筆上了!代碼如下:

void MyWidget::paintEvent(QPaintEvent *event)
{
 QPainter painter(this);
 painter.setRenderHint(QPainter::Antialiasing, true);

 QLinearGradient linearGradient(60, 50, 200, 200); 
 linearGradient.setColorAt(0.2, Qt::white); 
 linearGradient.setColorAt(0.6, Qt::green); 
 linearGradient.setColorAt(1.0, Qt::black); 
 painter.setPen(QPen(QBrush(linearGradient),5)); 
 painter.drawEllipse(50, 50, 200, 150);
}      

        下來看看我們的畫線的漸變效果吧!

Qt學習:QPainter之漸變填充

繼續閱讀