钢笔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枚举表示的内置样式:
只需使用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枚举提供以下样式:
SquareCap样式是一个方形线端点,它覆盖端点并延伸超出端点一半的线宽。FlatCap样式是一个不覆盖线端点的方形线端点。RoundCap样式是一个覆盖端点的圆形线末端。
默认值为SquareCap。
笔宽为0或1时是否绘制端点取决于笔帽样式。使用SquareCap或RoundCap绘制它们,而使用FlatCap则不绘制它们。
联接样式
连接样式定义了如何使用QPainter绘制两条连接线之间的连接。连接样式仅适用于宽线,即当宽度为1或更大时。PenJoinStyle枚举提供以下样式:
BevelJoin样式填充两条线之间的三角形缺口。斜接样式延伸直线,使其以一定角度相交。RoundJoin样式填充两条直线之间的圆弧。
默认值为BevelJoin。
应用斜接样式 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])方法设置,这些样式的外观如图所示。
-
钢笔的端点样式用SetCapStyle(Qt.PenCapStyle)方法设置,其中参数 Qt.PenCapStyle可取以下值,这些样式的区别如图所示。
- Qt.FlatCap 不包含端点
- Qt.SquareCap 包含端点,并延长半个宽度。
- Qt.RoundCap
-
两个线条连接点处的样式用setJoinStyle(QtPenJoinStyle)方法设置,其中参数Qt.PenJoinStyle 可取以下值,样式如图所示。
-
Qt.MiterJoin
-
Qt.BevelJoin
-
Qt.RoundJoin
-
Qt.SvgMiterJoin
-
当线条连接样式是Qt.MiterJoin 时,用setMiterLimit(float)方法设置延长线的长度其中参数 float 是线条宽度的倍数,默认是 20其延长线的含义如图所示:
-
-
用setDashPattern(Sequence[float])方法可以自定义虚线样式,其中参数的奇数项表示实线的长度,偶数项表示空白处的长度,长度以线宽为单位表示为线宽的倍数。
- 例如 setDashPattern([4,2,4,2])表示实线的长度是线宽的四倍
- 而空白处的长度是线宽的两倍用setDashOffset(float)方法可以设置虚线开始绘制的点与线起始点之间的距离,如果这个距离是动态的,则会形成动画效果。
-
钢笔QPen的应用实例
下面的程序用钢笔绘制一个带有背景图像、形状是"Z"形的虚线图
# -*- 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())