Qt技巧笔记(九):QPen 画笔类简介及绘图实践指南
`QPen` 是Qt绘图系统中用于定义线条(如轮廓线,边框线)样式(颜色、宽度、风格等)的类。其构造函数`QPen()`。 是Qt框架中用于定义如何绘制形状轮廓(线条)的一个非常重要的类。它控制`QPainter` 绘制线条、曲线和形状轮廓的外观,它包括线宽、颜色、样式、端点风格和连接风格等。
(一)基本属性简介
`QPen`主要用于设置以下属性:
| 主要属性 | 属性功能 |
|---|---|
| 线条宽度(Color) | 线条的粗细(像素) |
| 线条颜色(Width) | 支持 QColor、RGB 值或预定义颜色(如 Qt::red) |
| 线条样式(Style) | 如实线、虚线、点线等。 |
| 端点风格(Cap Style) | 线条端点的渲染方式(方形、圆形等)。 |
| 连接风格(Joint Style) | 多条线段连接处的渲染方式(斜接、圆角等)。 |
| 画刷 (Brush) | 实际上,填充线条的颜色是由 QBrush 决定的。如果你设置了一个渐变画刷给 QPen,可以绘制出渐变色的线条。 |
常用样式枚举值:
-
样条样式(
Qt.PenStyle)Qt.SolidLine 实线 Qt.DashLine 虚线(由较短的线段组成)。 Qt.DotLine 点线(由点组成)。 Qt.DashDotLine 点划线(交替的线段和点)。 Qt.DashDotDotLine 双点划线。 Qt.NoPen 不绘制线条(通常用于不需要边框的情况)。
端点样式 (Qt.PenCapStyle)
| Qt.FlatCap | 线条末端是方形的,不覆盖端点坐标。 |
|---|---|
| Qt.SquareCap | 线条末端是方形的,但会覆盖端点坐标(比 FlatCap 稍微长一点)。 |
| Qt.RoundCap | 线条末端是圆形的。 |
-
连接样式(Qt.RoundJoinStyle)
Qt.MiterJoin 尖角连接。 Qt.BevelJoin 平角连接(切角)。 Qt.RoundJoin 圆角连接。
设置样条样式:
C++
setStyle(Qt::PenStyle style);
设置样条宽度
C++
setWidth(int width); // 整数宽度(默认)
setWidthF(qreal width); // 浮点宽度(高精度)
设置颜色
C++
setColor(const QColor &color);
设置端点风格
C++
setCapStyle(Qt::PenCapStyle cap);
设置连接风格
C++
setCapStyle(Qt::PenCapStyle cap);
始终在创建 QPen 对象后,显式地设置您需要的颜色和宽度。
C++
QPen(); // 默认构造函数(黑色 1px 实线)
QPen(const QColor &color); // 指定颜色
QPen(const QBrush &brush, qreal width); // 指定画刷和宽度
QPen(const QBrush &brush, qreal width, Qt::PenStyle style); // 完整参数
(二)示例用法
2.1基本用法
C++
QPainter painter(this);
QPen pen(Qt::blue, 2, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin);
painter.setPen(pen);
painter.drawLine(10, 10, 100, 100);
2.2动态修改属性
C++
QPen pen;
pen.setColor(Qt::red);
pen.setWidth(3);
pen.setStyle(Qt::DotLine);
painter.setPen(pen);
painter.drawRect(50, 50, 100, 100);
2.3 自定义虚线
C++
QPen pen(Qt::black, 2);
QVector<qreal> pattern;
pattern << 1 << 3 << 5 << 3; // 自定义虚线模式
pen.setDashPattern(pattern);
painter.setPen(pen);
painter.drawEllipse(100, 100, 50, 50);
2.4 结合QBrush使用
C++
QPen pen(QBrush(Qt::green, Qt::DiagCrossPattern), 3);
painter.setPen(pen);
painter.drawLine(20, 20, 200, 20);
2.5 与QPainter配合使用
QPen 需通过 QPainter::setPen() 应用到绘制操作中:
C++
void MyWidget::paintEvent(QPaintEvent *event) {
QPainter painter(this);
// 设置画笔
QPen pen(Qt::blue, 2, Qt::SolidLine);
painter.setPen(pen);
// 绘制线条和形状
painter.drawLine(10, 10, 100, 100);
painter.drawRect(50, 50, 100, 100);
// 更换画笔
pen.setColor(Qt::red);
pen.setStyle(Qt::DashLine);
painter.setPen(pen);
painter.drawEllipse(100, 100, 50, 50);
}
常见应用场景
- 绘图工具:实现不同粗细、颜色的画笔。
- 数据可视化:绘制折线图、柱状图的边框。
- 界面设计:自定义控件的边框、指示器。
- CAD/图形软件:精确控制线条渲染。