QPen 类详解及常用方法
QPen
是 PyQt5 中用于定义 线条绘制样式 的类,控制 QPainter
绘制图形时的线条颜色、宽度、线型、端点及连接样式。以下是详细说明及常用方法:
一、核心功能
- 颜色:通过
QColor
或 Qt 预设颜色(如Qt.red
)设置。 - 线宽:定义线条粗细(单位:像素)。
- 线型:实线、虚线、点线等。
- 端点样式:线段端点的形状(圆头、方头)。
- 连接样式:线段拐角的连接方式(斜接、圆角、斜角)。
二、构造函数
构造函数 | 说明 | 示例 |
---|---|---|
QPen() | 默认构造函数(黑色、1px 实线) | pen = QPen() |
QPen(QColor) | 指定颜色(默认线宽 1px,实线) | pen = QPen(Qt.red) |
QPen(Qt.GlobalColor, width=1, style=Qt.SolidLine) | 指定颜色、线宽、线型 | pen = QPen(Qt.blue, 2, Qt.DashLine) |
QPen(QBrush, width, style, cap, join) | 使用画刷(支持渐变/纹理) | pen = QBrush(Qt.green), 2, Qt.DotLine |
三、常用方法
1. 颜色与线宽
方法 | 说明 | 示例 |
---|---|---|
setColor(QColor) | 设置线条颜色 | pen.setColor(QColor(255, 0, 0)) |
color() -> QColor | 获取当前颜色 | color = pen.color() |
setWidth(width: int) | 设置线宽(像素) | pen.setWidth(3) |
width() -> int | 获取当前线宽 | width = pen.width() |
2. 线型控制
方法 | 说明 | 示例 |
---|---|---|
setStyle(style: Qt.PenStyle) | 设置线型 | pen.setStyle(Qt.DashDotLine) |
style() -> Qt.PenStyle | 获取当前线型 | style = pen.style() |
线型枚举值(Qt.PenStyle):
Qt.SolidLine
:实线(默认)Qt.DashLine
:虚线Qt.DotLine
:点线Qt.DashDotLine
:点划线Qt.DashDotDotLine
:双点划线Qt.NoPen
:无线条
3. 端点与连接样式
| 方法 | 说明 | 示例 |
|------|------|
| setCapStyle(style: Qt.PenCapStyle)
| 设置端点样式 | pen.setCapStyle(Qt.RoundCap)
|
| capStyle() -> Qt.PenCapStyle
| 获取端点样式 | cap = pen.capStyle()
|
| setJoinStyle(style: Qt.PenJoinStyle)
| 设置连接样式 | pen.setJoinStyle(Qt.MiterJoin)
|
| joinStyle() -> Qt.PenJoinStyle
| 获取连接样式 | join = pen.joinStyle()
|
端点样式(Qt.PenCapStyle):
Qt.FlatCap
:方头(默认)Qt.SquareCap
:扩展方头(超出端点)Qt.RoundCap
:圆头
连接样式(Qt.PenJoinStyle):
Qt.MiterJoin
:斜接(默认)
Qt.BevelJoin`:斜角Qt.RoundJoin
:圆角
4. 其他操作
方法 | 说明 | 示例 |
---|---|---|
setBrush(QBrush) | 用画刷填充线条(支持渐变/纹理) | pen.setBrush(QBrush(Qt.diagonalPattern)) |
isCosmetic() -> bool | 检查是否为“装饰性”线条(线宽不随缩放变化) | pen.setCosmetic(True) |
四、代码示例
1. 基础线条绘制
python
from PyQt5.QtGui import QPainter, QPen, QColor
from PyQt5.QtCore import Qt
class Canvas(QWidget):
def paintEvent(self, event):
painter = QPainter(self)
# 红色虚线,线宽2px,圆头端点
pen = QPen(Qt.red, 2, Qt.DashLine)
pen.setCapStyle(Qt.RoundCap)
painter.setPen(pen)
painter.drawLine(50, 50, 200, 200)
2. 使用画刷填充线条
python
from PyQt5.Qt QLinearGradient
# 创建渐变画刷
gradient = QLinearGradient(0, 0, 100, 0)
gradient.setColorAt(0.0, Qt.red)
gradient.setColorAt(1.0, Qt.blue)
pen = QPen()
pen.setBrush(gradient)
pen.setWidth(5)
painter.setPen(pen)
painter.drawRect(10, 10, 100, 100)
3. 设置连接样式
python
pen = QPen(Qt.black, 4)
pen.setJoinStyle(Qt.RoundJoin) # 圆角连接
painter.setPen(pen)
painter.drawPolygon([QPoint(10,10), QPoint(100,10), QPoint(50,100)])
python
from PyQt5.QtGui import QPainter, QPolygon
from PyQt5.QtCore import QPoint
# 定义多边形的顶点列表
points = [
QPoint(50, 50),
QPoint(150, 50),
QPoint(200, 150),
QPoint(100, 200),
QPoint(50, 150)
]
# 将列表转换为 QPolygon
polygon = QPolygon(points)
# 绘制多边形
painter.drawPolygon(polygon)
五、注意事项
- 线宽与缩放:
默认线宽随QPainter
的缩放比例变化。若需固定线宽,设置pen.setCosmetic(True)
。 - 性能优化:
频繁修改画笔属性可能影响性能,建议复用实例。 - 平台差异:
某些线型(如虚线)在不同系统上的渲染效果可能不同。
通过灵活配置 QPen
,可精确控制图形线条的视觉效果,满足从基础到高级的绘图需求!