【Qt筆記】畫刷和畫筆

前面一章咱們提到,Qt 繪圖系統定義了兩個繪製時使用的關鍵屬性:畫刷和畫筆。前者使用QBrush描述,大多用於填充;後者使用QPen描述,大多用於繪製輪廓線。函數

 

QBrush定義了QPainter的填充模式,具備樣式、顏色、漸變以及紋理等屬性。this

畫刷的style()定義了填充的樣式,使用Qt::BrushStyle枚舉,默認值是Qt::NoBrush,也就是不進行任何填充。咱們能夠從下面的圖示中看到各類填充樣式的區別:spa

畫刷的color()定義了填充模式的顏色。這個顏色能夠是 Qt 預約義的顏色常量,也就是Qt::GlobalColor,也能夠是任意QColor對象。code

畫刷的gradient()定義了漸變填充。這個屬性只有在樣式是Qt::LinearGradientPatternQt::RadialGradientPattern或者Qt::ConicalGradientPattern之一時纔有效。漸變能夠由QGradient對象表示。Qt 提供了三種漸變:QLinearGradientQConicalGradientQRadialGradient,它們都是QGradient的子類。咱們能夠使用以下代碼片斷來定義一個漸變的畫刷:對象

QRadialGradient gradient(50, 50, 50, 50, 50);
gradient.setColorAt(0, QColor::fromRgbF(0, 1, 0, 1));
gradient.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0));

QBrush brush(gradient);

當畫刷樣式是 Qt::TexturePattern時,texture()定義了用於填充的紋理。注意,即便你沒有設置樣式爲Qt::TexturePattern,當你調用setTexture()函數時,QBrush會自動將style()設置爲Qt::TexturePatternit

QPen定義了用於QPainter應該怎樣畫線或者輪廓線。畫筆具備樣式、寬度、畫刷、筆帽樣式和鏈接樣式等屬性。畫筆的樣式style()定義了線的樣式。畫刷brush()用於填充畫筆所繪製的線條。筆帽樣式capStyle()定義了使用QPainter繪製的線的末端;鏈接樣式joinStyle()則定義了兩條線如何鏈接起來。畫筆寬度width()widthF()定義了畫筆的寬。注意,不存在寬度爲 0 的線。假設你設置 width 爲 0,QPainter依然會繪製出一條線,而這個線的寬度爲 1 像素。也就是說,畫筆寬度一般至少是 1 像素。io

這麼多參數既能夠在構造時指定,也能夠使用 set 函數指定,徹底取決於你的習慣,例如:class

QPainter painter(this);
QPen pen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);

等價於構造函數

QPainter painter(this);
QPen pen;  // creates a default pen

pen.setStyle(Qt::DashDotLine);
pen.setWidth(3);
pen.setBrush(Qt::green);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::RoundJoin);

painter.setPen(pen);

使用構造函數的優勢是代碼較短,可是參數含義不明確;使用 set 函數則正好反過來。im

默認的畫筆屬性是純黑色,0 像素,方形筆帽(Qt::SquareCap),斜面型鏈接(Qt::BevelJoin)。

下面是畫筆樣式的示例:

你也能夠使用setDashPattern()函數自定義樣式,例如以下代碼片斷:

QPen pen;
 QVector<qreal> dashes;
 qreal space = 4;

 dashes << 1 << space << 3 << space << 9 << space
        << 27 << space << 9 << space;

 pen.setDashPattern(dashes);

筆帽定義了畫筆末端的樣式,例如:

他們之間的區別是,Qt::SquareCap是一種包含了最後一個點的方形端點,使用半個線寬覆蓋;Qt::FlatCap不包含最後一個點;Qt::RoundCap是包含最後一個點的圓形端點。具體能夠參考下面的示例(出自《C++ GUI Programming with Qt 4, 2nd Edition》):

鏈接樣式定義了兩條線鏈接時的樣式,例如:

一樣,能夠參考下面圖示來理解這幾種鏈接樣式的細節(出自《C++ GUI Programming with Qt 4, 2nd Edition》):

注意,咱們前面說了,QPainter也是一個狀態機,這裏咱們所說的這些屬性都是處於這個狀態機之中的,所以,咱們應該記得是否要將其保存下來或者是從新構建。

相關文章
相關標籤/搜索