QPen 是Qt绘图控件里面的一个重要的组件,和QColor 一样也是类似的一个属性类。这个类就是描述一个画笔具有的属性。
一个画笔 Pen 有style(), width(), brush(), capStyle()和 joinStyle()。
笔的 style() [样式] 定义了线条的类型。brush() [笔刷] 用于填充 Pen 生成的笔画。使用QBrush类来指定填充样式。capStyle() [笔帽样式] 决定了可以使用QPainter绘制的线尾帽,而 joinStyle() [连接样式] 描述了如何绘制两条线之间的连接。笔的宽度可以以整数 ( width())和浮点(widthF())精度指定。线宽为0表示化妆笔。这意味着笔的宽度总是画一个像素宽,独立于 QPainter 的变换设置。
我们可以使用相应的 setStyle(), setWidth(), setBrush(), setCapStyle() 和 setJoinStyle() 函数可以很容易地修改各种设置(注意,当改变笔的属性时,painter的笔必须重置)。
例如:
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()方便函数,分别用于提取和设置Pen 笔刷的颜色。笔也可以进行 比较 和 写入 stream。
Qt提供了几个由Qt::PenStyle枚举表示的内置样式:
Qt::SolidLine | Qt::SolidLine | Qt::DotLine |
---|---|---|
Qt: DashDotLine | Qt: DashDotDotLine | Qt: CustomDashLine |
只需使用setStyle()函数将Pen 样式转换为内置样式中的任何一种,除了Qt::CustomDashLine样式,我们将很快回到它。将样式设置为Qt::NoPen告诉painter不绘制线条或轮廓。Pen 的默认样式是Qt::SolidLine。
自Qt 4.1以来,也可以使用 setDashPattern() 函数指定自定义破折号模式,该函数隐式地将笔的样式转换为Qt::CustomDashLine。模式参数QVector必须指定为偶数个qreal条目,其中条目1,3,5…是破折号和2,4,6…是空格。例如,上面显示的自定义模式是使用以下代码创建的:
QPen pen;
QVector<qreal> dashes;
qreal space = 4;
dashes << 1 << space << 3 << space << 9 << space
<< 27 << space << 9 << space;
pen.setDashPattern(dashes);
请注意,破折号图案是以笔的宽度为单位指定的,例如,宽度为10的长度为5的破折号长为50像素。
可以使用 dashPattern() 函数检索当前设置的破折号模式。使用isSolid()函数来确定Pen 是否有固体填充。
帽样式定义了如何使用QPainter绘制线条的端点。帽形样式仅适用于宽行,即宽度大于等于1的行。Qt::PenCapStyle enum提供了以下样式:
Qt::SquareCap | Qt::FlatCap | Qt::RoundCap |
---|---|---|
SquareCap样式是一个正方形的线端点,它覆盖了端点并以线宽的一半扩展到它之外。FlatCap样式是一个不覆盖行尾的方形行尾。而Qt::RoundCap样式是一个覆盖结束点的圆线结束。
默认为Qt::SquareCap。
当笔宽为0或1时是否绘制终点取决于 Cap Style 样式。使用 Qt::SquareCap 或 Qt::RoundCap它 们被绘制,使用Qt::FlatCap它们不被绘制。
连接样式定义了如何使用QPainter绘制两条连接线之间的连接。join样式只适用于宽线,即宽度大于等于1的线。
PenJoinStyle枚举提供了以下样式:
Qt: BevelJoin | Qt: MiterJoin | Qt: RoundJoin |
---|---|---|
BevelJoin样式填充两条线之间的三角形缺口。MiterJoin样式扩展线条以一定角度相交。而Qt::RoundJoin样式填充两条线之间的圆弧。
默认为Qt::BevelJoin。
当应用Qt::MiterJoin样式时,可以使用setMiterLimit()函数来指定斜接连接可以从连接点扩展多远。miterLimit()用于减少线连接之间的伪影,其中线接近平行。
miterLimit()必须以笔的宽度为单位指定,例如,宽度为10的miterLimit为50像素长。默认的斜接限制是2,即笔宽度的两倍(像素)。