Qt技巧笔记(九):QPen 画笔类简介及绘图实践指南

Qt技巧笔记(九):QPen 画笔类简介及绘图实践指南

复制代码
`QPen` 是Qt绘图系统中用于定义线条(如轮廓线,边框线)样式(颜色、宽度、风格等)的类。其构造函数`QPen()`。 是Qt框架中用于定义如何绘制形状轮廓(线条)的一个非常重要的类。它控制`QPainter` 绘制线条、曲线和形状轮廓的外观,它包括线宽、颜色、样式、端点风格和连接风格等。

(一)基本属性简介

复制代码
`QPen`主要用于设置以下属性:
主要属性 属性功能
线条宽度(Color) 线条的粗细(像素)
线条颜色(Width) 支持 QColor、RGB 值或预定义颜色(如 Qt::red
线条样式(Style) 如实线、虚线、点线等。
端点风格(Cap Style) 线条端点的渲染方式(方形、圆形等)。
连接风格(Joint Style) 多条线段连接处的渲染方式(斜接、圆角等)。
画刷 (Brush) 实际上,填充线条的颜色是由 QBrush 决定的。如果你设置了一个渐变画刷给 QPen,可以绘制出渐变色的线条。

常用样式枚举值:

  1. 样条样式(Qt.PenStyle

    Qt.SolidLine 实线
    Qt.DashLine 虚线(由较短的线段组成)。
    Qt.DotLine 点线(由点组成)。
    Qt.DashDotLine 点划线(交替的线段和点)。
    Qt.DashDotDotLine 双点划线。
    Qt.NoPen 不绘制线条(通常用于不需要边框的情况)

端点样式 (Qt.PenCapStyle

Qt.FlatCap 线条末端是方形的,不覆盖端点坐标。
Qt.SquareCap 线条末端是方形的,但会覆盖端点坐标(比 FlatCap 稍微长一点)。
Qt.RoundCap 线条末端是圆形的。
  1. 连接样式(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);
}

常见应用场景

  1. 绘图工具:实现不同粗细、颜色的画笔。
  2. 数据可视化:绘制折线图、柱状图的边框。
  3. 界面设计:自定义控件的边框、指示器。
  4. CAD/图形软件:精确控制线条渲染。