本页内容

QPen Class

QPen 类定义了QPainter 应如何绘制线条和图形的轮廓。更多内容...

头文件: #include <QPen>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui

公共函数

QPen()
QPen(Qt::PenStyle style)
QPen(const QColor &color)
QPen(const QBrush &brush, qreal width, Qt::PenStyle style = Qt::SolidLine, Qt::PenCapStyle cap = Qt::SquareCap, Qt::PenJoinStyle join = Qt::BevelJoin)
QPen(const QPen &pen)
QPen(QPen &&pen)
~QPen()
QBrush brush() const
Qt::PenCapStyle capStyle() const
QColor color() const
qreal dashOffset() const
QList<qreal> dashPattern() const
bool isCosmetic() const
bool isSolid() const
Qt::PenJoinStyle joinStyle() const
qreal miterLimit() const
void setBrush(const QBrush &brush)
void setCapStyle(Qt::PenCapStyle style)
void setColor(const QColor &color)
void setCosmetic(bool cosmetic)
void setDashOffset(qreal offset)
void setDashPattern(const QList<qreal> &pattern)
void setJoinStyle(Qt::PenJoinStyle style)
void setMiterLimit(qreal limit)
void setStyle(Qt::PenStyle style)
void setWidth(int width)
void setWidthF(qreal width)
Qt::PenStyle style() const
void swap(QPen &other)
int width() const
qreal widthF() const
operator QVariant() const
bool operator!=(const QPen &pen) const
QPen &operator=(QPen &&other)
QPen &operator=(const QPen &pen)
(since 6.9) QPen &operator=(QColor color)
(since 6.9) QPen &operator=(Qt::PenStyle style)
bool operator==(const QPen &pen) const
QDataStream &operator<<(QDataStream &stream, const QPen &pen)
QDataStream &operator>>(QDataStream &stream, QPen &pen)

详细说明

笔具有以下方法:style()、width()、brush()、capStyle() 和joinStyle()。

笔型(pen style)定义了线条类型。画笔(brush)用于填充由该笔生成的笔画。使用QBrush 类来指定填充样式。笔端样式(cap style)决定了可通过QPainter 绘制的线条端点样式,而连接样式(join style)则描述了两条线之间连接处的绘制方式。 笔宽既可以使用整数精度(width()),也可以使用浮点精度(widthF())进行指定。线宽为零表示装饰性笔。这意味着笔宽始终绘制为一个像素宽,与绘图器上设置的transformation 无关。

可以通过相应的setStyle()、setWidth()、setBrush()、setCapStyle()和setJoinStyle()函数轻松修改这些设置(请注意,在更改画笔属性时必须重置绘图器的画笔)。

例如:

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);

默认画笔为纯黑色实心画笔,笔宽为 1,笔尖样式为方形(Qt::SquareCap ),连接样式为斜角(Qt::BevelJoin )。

此外,QPen 还提供了color() 和setColor() 这两个便捷函数,分别用于获取和设置画笔的颜色。画笔还可以进行比较和流式处理。

有关绘图的一般信息,请参阅“绘图系统”文档。

画笔样式

Qt 提供了由Qt::PenStyle 枚举表示的几种内置样式:

只需使用setStyle() 函数即可将画笔样式转换为任一内置样式,但Qt::CustomDashLine 样式除外——我们稍后将详细讨论该样式。将样式设置为Qt::NoPen 可指示绘图器不绘制线条或轮廓。默认画笔样式为Qt::SolidLine 。

自 Qt 4.1 起,还可以通过setDashPattern() 函数指定自定义虚线图案,该函数会隐式地将笔触样式转换为Qt::CustomDashLine 。pattern 参数(类型为QList )必须指定为偶数个qreal 条目,其中条目 1、3、5... 为短划线,2、4、6…为空格。例如,上文所示的自定义图案是通过以下代码创建的:

QPen pen;
QList<qreal> dashes;
qreal space = 4;

dashes << 1 << space << 3 << space << 9 << space
           << 27 << space << 9 << space;

pen.setDashPattern(dashes);

请注意,破折号模式以笔宽为单位进行指定,例如,在宽度为 10 的情况下,长度为 5 的破折号长度为 50 像素。

可通过dashPattern()函数获取当前设置的破折号图案。使用isSolid()函数可判断画笔是否具有实心填充。

端点样式

端点样式通过QPainter 定义了线条端点的绘制方式。端点样式仅适用于宽线,即线宽为1或更大时。Qt::PenCapStyle 枚举提供了以下样式:

Qt::SquareCap 样式为方形线端,它覆盖线段端点并向外延伸,延伸长度为线宽的一半。Qt::FlatCap 样式为方形线端,但不覆盖线段端点。而Qt::RoundCap 样式为圆角线端,覆盖线段端点。

默认样式为Qt::SquareCap 。

当笔宽为 0 或 1 时,是否绘制端点取决于端点样式。使用Qt::SquareCap 或Qt::RoundCap 时会绘制端点,使用Qt::FlatCap 时则不会绘制。

连接样式

连接样式定义了如何使用QPainter 绘制两条相连线段之间的连接部分。连接样式仅适用于宽线,即笔宽为 1 或更大时。Qt::PenJoinStyle 枚举提供了以下样式:

Qt::BevelJoin 样式会填充两条线之间的三角形缺口。Qt::MiterJoin 样式会将两条线延伸至以一定角度相交。而Qt::RoundJoin 样式则会在两条线之间填充一个圆弧。

默认样式为 `Qt::BevelJoin`。

示意图展示了 miterLimit 如何控制 miterJoin 的锐角长度

应用“Qt::MiterJoin ”样式时,可以使用setMiterLimit()函数来指定斜接接头从接合点延伸的距离。miterLimit()用于减少两条线段接合处(当线段接近平行时)出现的伪影。

miterLimit() 的参数必须以笔宽为单位指定,例如,在笔宽为 10 的情况下,宽度为 5 的斜接限制长度即为 50 像素。默认的斜接限制值为 2,即笔宽的两倍(以像素为单位)。

带笔工具选项的路径描边应用程序路径描边示例

“路径描边”示例展示了 Qt 的内置虚线图案,并演示了如何使用自定义图案来扩展可用图案的范围。

另请参阅 QPainter 、QBrush 、路径描边示例以及涂鸦示例。

成员函数文档

QPen::QPen()

创建一个默认的黑色实线笔,宽度为 1。

QPen::QPen(Qt::PenStyle style)

创建一支宽度为 1、颜色为给定值的黑色笔:style 。

另请参阅 setStyle()。

QPen::QPen(const QColor &color)

绘制一条宽度为 1、颜色为给定值color 的实线。

另请参阅 setBrush() 和setColor()。

QPen::QPen(const QBrush &brush, qreal width, Qt::PenStyle style = Qt::SolidLine, Qt::PenCapStyle cap = Qt::SquareCap, Qt::PenJoinStyle join = Qt::BevelJoin)

创建一支具有指定brush 、width 、penstyle 、cap 样式以及join 样式的笔。

另请参阅 setBrush()、setWidth()、setStyle()、setCapStyle() 和setJoinStyle()。

[noexcept] QPen::QPen(const QPen &pen)

创建一个笔,该笔是给定pen 的副本。

[constexpr noexcept default] QPen::QPen(QPen &&pen)

创建一个从给定的pen 中移动过来的笔。

该“已移动”的笔对象仅可被赋值、复制或销毁。任何其他操作(在赋值之前)都会导致未定义行为。

[noexcept] QPen::~QPen()

把笔弄坏了。

QBrush QPen::brush() const

返回用于填充此笔生成的笔画的画笔。

另请参阅 setBrush()。

Qt::PenCapStyle QPen::capStyle() const

返回笔帽的样式。

另请参阅 setCapStyle() 和Cap Style 。

QColor QPen::color() const

返回此画笔的笔刷颜色。

另请参阅 brush() 和setColor()。

qreal QPen::dashOffset() const

返回笔的破折号偏移量。

另请参阅 setDashOffset()。

QList<qreal> QPen::dashPattern() const

返回此笔的破折号样式。

另请参阅 setDashPattern()、style(),以及isSolid()。

bool QPen::isCosmetic() const

如果画笔是装饰性画笔,则返回true ;否则返回false 。

装饰性画笔用于绘制宽度恒定的笔画,无论对其所配合使用的QPainter 应用何种变换,笔画宽度均保持不变。使用装饰性画笔绘制形状可确保其轮廓在不同的缩放因子下保持相同的粗细。

默认情况下,宽度为零的画笔是装饰性的。

另请参阅 setCosmetic() 和widthF()。

bool QPen::isSolid() const

如果画笔具有实心填充,则返回true ;否则返回 false。

另请参阅 style() 和dashPattern()。

Qt::PenJoinStyle QPen::joinStyle() const

返回笔触的连接样式。

另请参阅 setJoinStyle() 和Join Style 。

qreal QPen::miterLimit() const

返回笔的斜切限制。只有当接合样式设置为Qt::MiterJoin 时,斜切限制才起作用。

另请参阅 setMiterLimit() 和Join Style 。

void QPen::setBrush(const QBrush &brush)

将用于填充此画笔生成的笔画的画笔设置为指定的brush 。

另请参阅 brush() 和setColor()。

void QPen::setCapStyle(Qt::PenCapStyle style)

将笔帽样式设置为指定的style 。默认值为Qt::SquareCap 。

另请参阅 capStyle() 和Cap Style 。

void QPen::setColor(const QColor &color)

将此画笔的颜色设置为指定的color 。

另请参阅 setBrush() 和color()。

void QPen::setCosmetic(bool cosmetic)

根据cosmetic 的值,将此笔设置为“外观”或“非外观”模式。

另请参阅 isCosmetic()。

void QPen::setDashOffset(qreal offset)

将此画笔的虚线偏移量(即虚线图案的起始点)设置为指定的offset 值。偏移量的测量单位与指定虚线图案时所用的单位相同。

具有不同偏移量的连线图案例如,对于一种每笔画长度为四个单位、随后间隔两个单位的图案,当将其绘制为一条线时,将从笔画开始绘制。

但是,如果虚线偏移量设置为 4.0,则绘制的任何线条都将从间隙处开始。偏移量值小于等于 4.0 时,将先绘制部分笔画;偏移量值在 4.0 到 6.0 之间时,线条将从部分间隙处开始。

注意:这会 隐式地将画笔样式转换为Qt::CustomDashLine 。

另请参阅 dashOffset()。

void QPen::setDashPattern(const QList<qreal> &pattern)

将此画笔的破折号图案设置为给定的pattern 。这会隐式地将画笔样式转换为Qt::CustomDashLine 。

该图案必须指定为偶数个正数条目,其中第 1、3、5… 个条目为短线,第 2、4、6… 个条目为空格。例如:

自定义虚线
QPen pen;
QList<qreal> dashes;
qreal space = 4;
dashes << 1 << space << 3 << space << 9 << space
           << 27 << space << 9 << space;
pen.setDashPattern(dashes);

连线图案以画笔宽度的单位指定;例如,在宽度为 10 的情况下,长度为 5 的连线长度为 50 像素。请注意,宽度为零的画笔等同于宽度为 1 像素的装饰性画笔。

每个短划线还受端点样式的影响,因此,如果将长度为 1 的短划线设置为方形端点,则该短划线将向每个方向延伸 0.5 像素,导致总宽度为 2。

请注意,默认端点样式为Qt::SquareCap ,这意味着方形线端会覆盖端点,并向外延伸半个线宽。

另请参阅 setStyle()、dashPattern()、setCapStyle() 和setCosmetic()。

void QPen::setJoinStyle(Qt::PenJoinStyle style)

将笔的连接样式设置为指定的style 。默认值为Qt::BevelJoin 。

另请参阅 joinStyle() 和Join Style 。

void QPen::setMiterLimit(qreal limit)

将此笔的斜接限制设置为指定的limit 。

带有“宽度”和“斜切限制”标签的斜接接头

斜接限制描述了斜接接头可以从接合点延伸多远。这用于减少在两条线接近平行时的线段接合处产生的伪影。

此值仅在笔触样式设置为Qt::MiterJoin 时生效。该值以笔触宽度为单位指定,例如,在宽度为10的情况下,5的斜接限制长度为50像素。默认斜接限制为2,即笔触宽度的两倍(以像素为单位)。

另请参阅 miterLimit()、setJoinStyle() 和Join Style 。

void QPen::setStyle(Qt::PenStyle style)

将笔触样式设置为给定的style 。

有关可用样式的列表,请参阅Qt::PenStyle 文档。自Qt 4.1起,还可以使用setDashPattern()函数指定自定义虚线图案,该函数会隐式地将笔的样式转换为Qt::CustomDashLine 。

注意:此 函数会将虚线偏移量重置为零。

另请参阅 style() 和Pen Style 。

void QPen::setWidth(int width)

将笔宽设置为指定的width (以像素为单位,采用整数精度)。

线宽为零表示装饰性画笔。这意味着画笔宽度始终以一像素的宽度绘制,与在绘图器上设置的transformation 值无关。

不支持设置负值的笔宽。

另请参阅 setWidthF() 和width()。

void QPen::setWidthF(qreal width)

将笔宽设置为指定为“width ”的像素值,采用浮点精度。

线宽为零表示装饰性画笔。这意味着画笔的宽度始终为一个像素,与绘图器上的transformation 值无关。

不支持将画笔宽度设置为负值。

另请参阅 setWidth() 和widthF()。

Qt::PenStyle QPen::style() const

返回笔触样式。

另请参阅 setStyle() 和Pen Style 。

[noexcept] void QPen::swap(QPen &other)

将这支笔与other 互换。此操作非常快速,且从未失败。

int QPen::width() const

返回笔宽,精度为整数。

另请参阅 setWidth() 和widthF()。

qreal QPen::widthF() const

返回具有浮点精度的笔宽。

另请参阅 setWidthF() 和width()。

QPen::operator QVariant() const

将笔作为QVariant 返回。

bool QPen::operator!=(const QPen &pen) const

如果该笔与给定的pen 不同,则返回true ;否则返回 false。当两支笔的样式、宽度或颜色不同时,即视为不同。

另请参阅 operator==()。

[noexcept] QPen &QPen::operator=(QPen &&other)

将other 通过move-assign操作赋值给此QPen 实例。

[noexcept] QPen &QPen::operator=(const QPen &pen)

将给定的pen 分配给这支笔,并返回对这支笔的引用。

[since 6.9] QPen &QPen::operator=(QColor color)

将此笔设置为指定颜色的实心笔,并采用默认的笔帽和连接样式,同时返回对此笔的引用。

这是一个重载函数。

该函数在 Qt 6.9 中引入。

[since 6.9] QPen &QPen::operator=(Qt::PenStyle style)

将此笔设置为一款实心黑色笔,采用默认的笔帽和笔身连接样式,并返回对此笔的引用。

这是一个重载函数。

该函数在 Qt 6.9 中引入。

bool QPen::operator==(const QPen &pen) const

如果该笔与给定的pen 相等,则返回true ;否则返回 false。当两支笔的样式、宽度和颜色相同时,即视为相等。

另请参阅 operator!=()。

相关非成员

QDataStream &operator<<(QDataStream &stream, const QPen &pen)

将给定的pen 写入给定的stream ,并返回对stream 的引用。

另请参阅 《Qt 数据类型的序列化》。

QDataStream &operator>>(QDataStream &stream, QPen &pen)

将给定的stream 中的笔读取到给定的pen 中,并返回对stream 的引用。

另请参阅 《Qt 数据类型的序列化》。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.