前面一章咱們提到,Qt 繪圖系統定義了兩個繪製時使用的關鍵屬性:畫刷和畫筆。前者使用QBrush
描述,大多用於填充;後者使用QPen
描述,大多用於繪製輪廓線。函數
QBrush
定義了QPainter
的填充模式,具備樣式、顏色、漸變以及紋理等屬性。this
畫刷的style()
定義了填充的樣式,使用Qt::BrushStyle
枚舉,默認值是Qt::NoBrush
,也就是不進行任何填充。咱們能夠從下面的圖示中看到各類填充樣式的區別:spa
畫刷的color()
定義了填充模式的顏色。這個顏色能夠是 Qt 預約義的顏色常量,也就是Qt::GlobalColor
,也能夠是任意QColor
對象。code
畫刷的gradient()
定義了漸變填充。這個屬性只有在樣式是Qt::LinearGradientPattern
、Qt::RadialGradientPattern
或者Qt::ConicalGradientPattern
之一時纔有效。漸變能夠由QGradient
對象表示。Qt 提供了三種漸變:QLinearGradient
、QConicalGradient
和QRadialGradient
,它們都是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::TexturePattern
。it
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
也是一個狀態機,這裏咱們所說的這些屬性都是處於這個狀態機之中的,所以,咱們應該記得是否要將其保存下來或者是從新構建。