131-QPainter和Graphics/View绘图-QPainter绘图-钢笔QPen的用法

钢笔QPen的用法

钢笔 QPen 用于绘制线条,线条有样式(实线、虚线、点虚线)、颜色、宽度等属性用QPainter 的 setPen(QPen)方法为 QPainter 设置钢笔。

用QPen 创建钢笔的方法如下

  • s是QtPenStyle的举值用于设置钢笔的样式;
  • 画刷 brush 可以用QBrush,QColorQt.GlobalColor和 QGradient 来设置;
  • c是 Qt.PenCapStyle 的枚举值,用于设置线条端点样式;
  • j是Qt.PenJoinStyle 的枚举值,用于设置线条连接点处的样式。
  • 钢笔默认的颜色是黑色,宽度是1像素,样式是实线,端点样式是 Qt.SquareCap,连接处是 Qt.BevelJoin。
from PySide6.QtGui import QPen

QPen(self)-> None
QPen(arg__1: PySide6.QtCore.Qt.PenStyle)-> None
QPen(brush: Union[PySide6.QtGui.QBrush,PySide6.QtCore.Qt.BrushStyle,PySide6.QtCore.Qt.GlobalColor,PySide6.QtGui.QColor,PySide6.QtGui.QGradient,PySide6.QtGui.QImage,PySide6.QtGui.QPixmap],width: float,s: PySide6.QtCore.Qt.PenStyle = Instance(Qt.SolidLine),c: PySide6.QtCore.Qt.PenCapStyle = Instance(Qt.SquareCap),j: PySide6.QtCore.Qt.PenJoinStyle = Instance(Qt.BevelJoin))-> None
QPen(color: Union[PySide6.QtGui.QColor,PySide6.QtGui.QRgba64,Any,PySide6.QtCore.Qt.GlobalColor,str,int])-> None
QPen(pen: Union[PySide6.QtGui.QPen,PySide6.QtCore.Qt.PenStyle,PySide6.QtGui.QColor])-> None 
钢笔QPen的说明

钢笔有一个style()、width()、brush(),capStyle()和joinStyle()。
画笔样式定义线条类型。画笔用于填充用笔生成的笔划。使用QBrush类可以指定填充样式。封口样式确定可以使用QPainter绘制的线封口,而连接样式描述如何绘制两条线之间的连接。可以以整数(width())和浮点(widthF())精度指定笔的宽度。线宽为零表示化妆笔。这意味着笔的宽度总是画一个像素宽,与画家上设置的变换无关。
使用相应的setStyle()、setWidth()、setBrush()、setCapStyle()和setJoinStyle()函数可以很容易地修改各种设置(注意,更改画笔的属性时必须重置画笔)。
例如:

painter = QPainter(self)
pen = QPen(Qt.green,3,Qt.DashDotLine,Qt.RoundCap,Qt.RoundJoin)
painter.setPen(pen)

相当于

painter = QPainter(self)
pen = QPen()
pen.setStyle(Qt.DashDotLine)
pen.setWidth(3)
pen.setBrush(Qt.green)
pen.setCapStyle(Qt.RoundCap)
pen.setJoinStyle(Qt.RoundJoin)
painter.setPen(pen)

默认画笔为实心黑色画笔,具有1个宽度、方形帽样式(SquareCap)和斜角连接样式(BevelJoin)。
此外,QPen还提供了color()和setColor()便利函数,分别用于提取和设置画笔的颜色。笔也可以进行比较和流式传输。
有关绘制的详细信息,请参见"绘制系统"文档。

画笔样式

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

image-20230428134319786

只需使用setStyle()函数将笔的样式转换为任何一种内置样式,但CustomDashLine样式除外,我们稍后将谈到它。将样式设置为NoPen告诉画家不要绘制线条或轮廓。默认的画笔样式为实线。
由于Qt 4.1,还可以使用setDashPattern()函数指定自定义短划线,该函数隐式地将笔的样式转换为CustomDashLine。模式参数QList必须指定为偶数个qreal条目,其中条目1、3、5…是短划线,2、4、6…是空格。例如,上面显示的自定义图案是使用以下代码创建的:

pen = QPen()
dashes = QList()
space = 4
dashes << 1 << space << 3 << space << 9 << space
           << 27 << space << 9 << space
pen.setDashPattern(dashes)

注意,虚线图案是以笔的宽度为单位指定的,例如,宽度10中长度为5的虚线是50像素长。
可以使用dashPattern()函数检索当前设置的破折号图案。使用isSolid()函数来确定笔是否有实心填充。

端点样式

帽盖样式定义了如何使用QPainter绘制线的端点。大写样式仅适用于宽线条,即当宽度为1或更大时。PenCapStyle枚举提供以下样式:

image-20230428134432987

SquareCap样式是一个方形线端点,它覆盖端点并延伸超出端点一半的线宽。FlatCap样式是一个不覆盖线端点的方形线端点。RoundCap样式是一个覆盖端点的圆形线末端。
默认值为SquareCap。
笔宽为0或1时是否绘制端点取决于笔帽样式。使用SquareCap或RoundCap绘制它们,而使用FlatCap则不绘制它们。

联接样式

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

image-20230428134542646

BevelJoin样式填充两条线之间的三角形缺口。斜接样式延伸直线,使其以一定角度相交。RoundJoin样式填充两条直线之间的圆弧。
默认值为BevelJoin。

../../_images/qpen-miterlimit.png

应用斜接样式 MiterJoin时,可以使用setMiterLimit()函数来指定斜接可以从连接点延伸多远。miterLimit()用于减少线接近平行的线连接之间的伪影。
斜接限制()必须以笔的宽度为单位指定,例如,宽度为5的斜接限制10为50像素长。默认斜接限制为2,即笔宽度的两倍(以像素为单位)。

路径漫游示例The Path Stroking Example
Path Stroking示例显示了Qt内置的破折号图案,并显示了如何使用自定义图案来扩展可用图案的范围。

钢笔QPen的常用方法

钢笔QPen的常用方法如表所示,主要方法介绍如下

QPen的方法及参数类型> 说 明
setStyle(Qt.PenStyle)设置线条样式
style()获取线条样式
setWidth(int)、setWidthF(float)设置线条宽度
widtb()、widthF()获取线条宽度
isSolid()获取线条样式是否是实线填充
setBrush(brush:Union[QBrush,Qt.BrushStyle,QColor,Qt.GlobalColor,QGradient,QImage,QPixmap])设置画刷
brusb()获取画刷 QBrush
setCapStyle(Qt.PenCapStyle)设置线端部的样式
capStyle()获取线端部的样式 Qt.PenCapStyle
setColor(Union[QColor,Qt.GlobalColor,str,int])设置颜色
color()获取颜色QColor
setCosmetic(cosmetic:bool)设置是否进行装饰
isCosmetic()获取是否进行装饰
setDashOffset(doffset: float)设置虚线开始绘制的点与线起始点的距离
setDashPattern(pattern:Sequence[float])设置用户自定义虚线样式
dashPattern()获取自定义样式
setJoinStyle(Qt.PenJoinStyle)设置两相交线连接点处的样式
setMiterLimit(float)设置斜接延长线的长度
  • 线条的宽度用setWidth(int)或 setWidthF(float)方法设置

    • 如果宽度始终为0,表示是装饰线条;
    • 装饰线条也可用setCosmetic(bool)方法设置。
  • 装饰线条是指具有恒定宽度的边,可确保线条在不同缩放比例下具有相同的宽度。

    • 线条的样式用setStyle(Qt.PenStyle)方法设置参数 Qt.PenStyle可取的值如表所示

      枚举类型描 述
      Qt.NoPen没有线,如使用QPainter.drawRect()填充,没有绘制任何边界线
      Qt.SolidLine一条简单的线
      Qt.DashLine由一些像素分隔的短线
      Qt.DotLine由一些像素分隔的点
      Qt.DashDotLine轮流交替的点和短线
      Qt.DashDotDotLine一条短线、两个点
      Qt.MPenStyle画笔风格的掩码
      Qt.CustomDashLine自定义线
    • 其中自定义样式需要用setDashPattern(Sequence[float])方法设置,这些样式的外观如图所示。

      image-20230306233921226

    • 钢笔的端点样式用SetCapStyle(Qt.PenCapStyle)方法设置,其中参数 Qt.PenCapStyle可取以下值,这些样式的区别如图所示。

      image-20230306234107667

      • Qt.FlatCap 不包含端点
      • Qt.SquareCap 包含端点,并延长半个宽度。
      • Qt.RoundCap
    • 两个线条连接点处的样式用setJoinStyle(QtPenJoinStyle)方法设置,其中参数Qt.PenJoinStyle 可取以下值,样式如图所示。

      image-20230306234250215

      • Qt.MiterJoin

      • Qt.BevelJoin

      • Qt.RoundJoin

      • Qt.SvgMiterJoin

      • 当线条连接样式是Qt.MiterJoin 时,用setMiterLimit(float)方法设置延长线的长度其中参数 float 是线条宽度的倍数,默认是 20其延长线的含义如图所示:

        img

    • 用setDashPattern(Sequence[float])方法可以自定义虚线样式,其中参数的奇数项表示实线的长度,偶数项表示空白处的长度,长度以线宽为单位表示为线宽的倍数。

      • 例如 setDashPattern([4,2,4,2])表示实线的长度是线宽的四倍
      • 而空白处的长度是线宽的两倍用setDashOffset(float)方法可以设置虚线开始绘制的点与线起始点之间的距离,如果这个距离是动态的,则会形成动画效果。
钢笔QPen的应用实例

下面的程序用钢笔绘制一个带有背景图像、形状是"Z"形的虚线图

image-20230306235701933

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/6 23:45
# File_name: 02- 钢笔QPen的应用实例.py


import sys,math
from PySide6.QtWidgets import QApplication,QWidget
from PySide6.QtGui import QPen,QPainter,QPixmap
from PySide6.QtCore import QPointF,Qt


class MyWindow(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)

        self.resize(600,500)

    def paintEvent(self,event):
        painter = QPainter(self)

        pix = QPixmap(r"../../Resources/images/d8.png")# 图像
        pen = QPen(pix,10)# 含有背景图像的钢笔,线宽是 40
        pen.setStyle(Qt.DashLine)
        pen.setJoinStyle(Qt.MiterJoin)
        painter.setPen(pen)# 设置钢笔

        p1 = QPointF(50,50)
        p2 = QPointF(self.width()- 50,50)
        p3 = QPointF(50,self.height()- 50)
        p4 = QPointF(self.width()- 50,self.height()- 50)
        painter.drawPolyline([p1,p2,p3,p4])# 绘制折线


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyWindow()

    win.show()
    sys.exit(app.exec())

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值