文章轉載自:https://www.devbean.net/2012/11/qt-study-road-2-brush-pen/
前面一章我們提到,Qt 繪圖系統定義了兩個繪制時使用的關鍵屬性:畫刷和畫筆。前者使用QBrush
描述,大多用於填充;後者使用QPen
描述,大多用於繪制輪廓線。
QBrush
定義了QPainter
的填充模式,具有樣式、顏色、漸變以及紋理等屬性。
畫刷的style()
定義了填充的樣式,使用Qt::BrushStyle
枚舉,默認值是Qt::NoBrush
,也就是不進行任何填充。我們可以從下面的圖示中看到各種填充樣式的區別:
畫刷的color()
定義了填充模式的顏色。這個顏色可以是 Qt 預定義的顏色常量,也就是Qt::GlobalColor
,也可以是任意QColor
對象。
畫刷的gradient()
定義了漸變填充。這個屬性只有在樣式是Qt::LinearGradientPattern
、Qt::RadialGradientPattern
或者Qt::ConicalGradientPattern
之一時才有效。漸變可以由QGradient
對象表示。Qt 提供了三種漸變:QLinearGradient
、QConicalGradient
和QRadialGradient
,它們都是QGradient
的子類。我們可以使用如下代碼片段來定義一個漸變的畫刷:
1 QRadialGradient gradient(50, 50, 50, 50, 50); 2 gradient.setColorAt(0, QColor::fromRgbF(0, 1, 0, 1)); 3 gradient.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0)); 4 5 QBrush brush(gradient);
當畫刷樣式是 Qt::TexturePattern
時,texture()
定義了用於填充的紋理。注意,即使你沒有設置樣式為Qt::TexturePattern
,當你調用setTexture()
函數時,QBrush
會自動將style()
設置為Qt::TexturePattern
。
QPen
定義了用於QPainter
應該怎樣畫線或者輪廓線。畫筆具有樣式、寬度、畫刷、筆帽樣式和連接樣式等屬性。畫筆的樣式style()
定義了線的樣式。畫刷brush()
用於填充畫筆所繪制的線條。筆帽樣式capStyle()
定義了使用QPainter
繪制的線的末端;連接樣式joinStyle()
則定義了兩條線如何連接起來。畫筆寬度width()
或widthF()
定義了畫筆的寬。注意,不存在寬度為 0 的線。假設你設置 width 為 0,QPainter
依然會繪制出一條線,而這個線的寬度為 1 像素。也就是說,畫筆寬度通常至少是 1 像素。
這麼多參數既可以在構造時指定,也可以使用 set 函數指定,完全取決於你的習慣,例如:
1 QPainter painter(this); 2 QPen pen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin); 3 painter.setPen(pen);
等價於
1 QPainter painter(this); 2 QPen pen; // creates a default pen 3 4 pen.setStyle(Qt::DashDotLine); 5 pen.setWidth(3); 6 pen.setBrush(Qt::green); 7 pen.setCapStyle(Qt::RoundCap); 8 pen.setJoinStyle(Qt::RoundJoin); 9 10 painter.setPen(pen);
使用構造函數的優點是代碼較短,但是參數含義不明確;使用 set 函數則正好反過來。
默認的畫筆屬性是純黑色,0 像素,方形筆帽(Qt::SquareCap
),斜面型連接(Qt::BevelJoin
)。
下面是畫筆樣式的示例:
你也可以使用setDashPattern()
函數自定義樣式,例如如下代碼片段:
1 QPen pen; 2 QVector<qreal> dashes; 3 qreal space = 4; 4 5 dashes << 1 << space << 3 << space << 9 << space 6 << 27 << space << 9 << space; 7 8 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
也是一個狀態機,這裡我們所說的這些屬性都是處於這個狀態機之中的,因此,我們應該記得是否要將其保存下來或者是重新構建。