#(25):畫刷和畫筆
前面一章我們提到,Qt 繪圖系統定義了兩個繪制時使用的關鍵屬性:畫刷和畫筆。前者使用`QBrush`描述,大多用于填充;后者使用`QPen`描述,大多用于繪制輪廓線。
`QBrush`定義了`QPainter`的填充模式,具有樣式、顏色、漸變以及紋理等屬性。
畫刷的`style()`定義了填充的樣式,使用`Qt::BrushStyle`枚舉,默認值是`Qt::NoBrush`,也就是不進行任何填充。我們可以從下面的圖示中看到各種填充樣式的區別:
[](http://files.devbean.net/images/2012/11/brush-fill-pattern.png)
畫刷的`color()`定義了填充模式的顏色。這個顏色可以是 Qt 預定義的顏色常量,也就是`Qt::GlobalColor`,也可以是任意`QColor`對象。
畫刷的`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`。
`QPen`定義了用于`QPainter`應該怎樣畫線或者輪廓線。畫筆具有樣式、寬度、畫刷、筆帽樣式和連接樣式等屬性。畫筆的樣式`style()`定義了線的樣式。畫刷`brush()`用于填充畫筆所繪制的線條。筆帽樣式`capStyle()`定義了使用`QPainter`繪制的線的末端;連接樣式`joinStyle()`則定義了兩條線如何連接起來。畫筆寬度`width()`或`widthF()`定義了畫筆的寬。注意,不存在寬度為 0 的線。假設你設置 width 為 0,`QPainter`依然會繪制出一條線,而這個線的寬度為 1 像素。也就是說,畫筆寬度通常至少是 1 像素。
這么多參數既可以在構造時指定,也可以使用 set 函數指定,完全取決于你的習慣,例如:
~~~
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 函數則正好反過來。
默認的畫筆屬性是純黑色,0 像素,方形筆帽(`Qt::SquareCap`),斜面型連接(`Qt::BevelJoin`)。
下面是畫筆樣式的示例:
[](http://files.devbean.net/images/2012/11/pen-style.png)
你也可以使用`setDashPattern()`函數自定義樣式,例如如下代碼片段:
~~~
QPen pen;
QVector<qreal> dashes;
qreal space = 4;
dashes << 1 << space << 3 << space << 9 << space
<< 27 << space << 9 << space;
pen.setDashPattern(dashes);
~~~
筆帽定義了畫筆末端的樣式,例如:
[](http://files.devbean.net/images/2012/11/cap-style.png)
他們之間的區別是,`Qt::SquareCap`是一種包含了最后一個點的方形端點,使用半個線寬覆蓋;`Qt::FlatCap`不包含最后一個點;`Qt::RoundCap`是包含最后一個點的圓形端點。具體可以參考下面的示例(出自《C++ GUI Programming with Qt 4, 2nd Edition》):
[](http://files.devbean.net/images/2012/11/cap-style-2.png)
連接樣式定義了兩條線連接時的樣式,例如:
[](http://files.devbean.net/images/2012/11/join-style.png)
同樣,可以參考下面圖示來理解這幾種連接樣式的細節(出自《C++ GUI Programming with Qt 4, 2nd Edition》):
[](http://files.devbean.net/images/2012/11/join-style-2.png)
注意,我們前面說了,`QPainter`也是一個狀態機,這里我們所說的這些屬性都是處于這個狀態機之中的,因此,我們應該記得是否要將其保存下來或者是重新構建。
- (1)序
- (2)Qt 簡介
- (3)Hello, world!
- (4)信號槽
- (5)自定義信號槽
- (6)Qt 模塊簡介
- (7)MainWindow 簡介
- (8)添加動作
- (9)資源文件
- (10)對象模型
- (11)布局管理器
- (12)菜單欄、工具欄和狀態欄
- (13)對話框簡介
- (14)對話框數據傳遞
- (15)標準對話框 QMessageBox
- (16)深入 Qt5 信號槽新語法
- (17)文件對話框
- (18)事件
- (19)事件的接受與忽略
- (21)事件過濾器
- (22)事件總結
- (23)自定義事件
- (24)Qt 繪制系統簡介
- (25)畫刷和畫筆
- (26)反走樣
- (27)漸變
- (28)坐標系統
- (29)繪制設備
- (30)Graphics View Framework
- (31)貪吃蛇游戲(1)
- (32)貪吃蛇游戲(2)
- (33)貪吃蛇游戲(3)
- (34)貪吃蛇游戲(4)
- (35)文件
- (36)二進制文件讀寫
- (37)文本文件讀寫
- (38)存儲容器
- (39)遍歷容器
- (40)隱式數據共享
- (41)model/view 架構
- (42)QListWidget、QTreeWidget 和 QTableWidget
- (43)QStringListModel
- (44)QFileSystemModel
- (45)模型
- (46)視圖和委托
- (47)視圖選擇
- (48)QSortFilterProxyModel
- (49)自定義只讀模型
- (50)自定義可編輯模型
- (51)布爾表達式樹模型
- (52)使用拖放
- (53)自定義拖放數據
- (54)剪貼板
- (55)數據庫操作
- (56)使用模型操作數據庫
- (57)可視化顯示數據庫數據
- (58)編輯數據庫外鍵
- (59)使用流處理 XML
- (60)使用 DOM 處理 XML
- (61)使用 SAX 處理 XML
- (62)保存 XML
- (63)使用 QJson 處理 JSON
- (64)使用 QJsonDocument 處理 JSON
- (65)訪問網絡(1)
- (66)訪問網絡(2)
- (67)訪問網絡(3)
- (68)訪問網絡(4)
- (69)進程
- (70)進程間通信
- (71)線程簡介
- (72)線程和事件循環
- (73)Qt 線程相關類
- (74)線程和 QObject
- (75)線程總結
- (76)QML 和 QtQuick 2
- (77)QML 語法
- (78)QML 基本元素
- (79)QML 組件
- (80)定位器
- (81)元素布局
- (82)輸入元素
- (83)Qt Quick Controls
- (84)Repeater
- (85)動態視圖
- (86)視圖代理
- (87)模型-視圖高級技術
- (88)Canvas
- (89)Canvas(續)