#(25):画刷和画笔
前面一章我们提到,Qt 绘图系统定义了两个绘制时使用的关键属性:画刷和画笔。前者使用`QBrush`描述,大多用于填充;后者使用`QPen`描述,大多用于绘制轮廓线。
`QBrush`定义了`QPainter`的填充模式,具有样式、颜色、渐变以及纹理等属性。
画刷的`style()`定义了填充的样式,使用`Qt::BrushStyle`枚举,默认值是`Qt::NoBrush`,也就是不进行任何填充。我们可以从下面的图示中看到各种填充样式的区别:
[![](https://box.kancloud.cn/2015-12-29_5682324ee6aa3.png)](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`)。
下面是画笔样式的示例:
[![](https://box.kancloud.cn/2015-12-29_5682324f0bdbe.png)](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);
~~~
笔帽定义了画笔末端的样式,例如:
[![](https://box.kancloud.cn/2015-12-29_5682324f244c1.png)](http://files.devbean.net/images/2012/11/cap-style.png)
他们之间的区别是,`Qt::SquareCap`是一种包含了最后一个点的方形端点,使用半个线宽覆盖;`Qt::FlatCap`不包含最后一个点;`Qt::RoundCap`是包含最后一个点的圆形端点。具体可以参考下面的示例(出自《C++ GUI Programming with Qt 4, 2nd Edition》):
[![](https://box.kancloud.cn/2015-12-29_5682324f34010.png)](http://files.devbean.net/images/2012/11/cap-style-2.png)
连接样式定义了两条线连接时的样式,例如:
[![](https://box.kancloud.cn/2015-12-29_5682324f45830.png)](http://files.devbean.net/images/2012/11/join-style.png)
同样,可以参考下面图示来理解这几种连接样式的细节(出自《C++ GUI Programming with Qt 4, 2nd Edition》):
[![](https://box.kancloud.cn/2015-12-29_5682324f67ae1.png)](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(续)