PyQt 使用QPainter绘制雷达扫描效果源码分享
- 一、源码分享
-
- 1、效果展示
- 2、源码分享
- 3、软件包安装
- 二、QPainter详解
-
- 1、 引言
- 2、 QPainter 基础概念
-
- 2.1、 什么是 QPainter?
- 2.2、 坐标系系统
- 2.3、 绘图设备与绘图上下文
- 3、基本绘图操作
-
- 3.1 、绘制基本图形
- 3.2、 绘制文本
- 3.3、 绘制图像
- 4、 画笔与画刷详解
-
- 4.1 、QPen:控制轮廓样式
- 4.2、 QBrush:控制填充样式
- 5、 坐标变换与视图操作
-
- 5.1 、基本变换操作
- 5.2 、视图与窗口映射
- 5.3、 组合变换
- 6、高级绘图功能
-
- 6.1 、路径绘制(QPainterPath)
- 6.2、 抗锯齿与渲染提示
- 6.3、 合成模式
- 7、相关API介绍
-
- 7.1、 基本图形绘制方法
-
- 绘制点
- 绘制直线
- 绘制矩形
- 绘制椭圆和圆
- 绘制多边形
- 绘制弧线、弦和扇形
- 7.2、 文本绘制方法
-
- 简单文本绘制
- 矩形内文本绘制
- 高级文本绘制
- 7.3、 图像绘制方法
-
- 基本图像绘制
- 部分图像绘制
- Pixmap 绘制
- 7.4、 路径绘制方法
-
- 路径操作
- 路径绘制快捷方法
- 7.5、 填充和背景方法
-
- 区域填充
- 背景清除
- 渐变填充
- 7.6、 变换和状态方法
-
- 坐标变换
- 状态管理
- 视图和窗口
- 7.7、 样式和属性设置方法
-
- 画笔和画刷
- 字体和文本
- 渲染提示
- 合成模式
- 7.8、 辅助方法
-
- 裁剪区域
- 绘制设备
- 坐标转换
一、源码分享
1、效果展示

示 

2、源码分享
import sys
import math
from PyQt6.QtWidgets import QApplication, QWidget, QSizePolicy, QToolTip
from PyQt6.QtGui import (
QPainter, QPen, QBrush, QColor, QFont, QConicalGradient,
QTransform
)
from PyQt6.QtCore import (
Qt, QTimer, QPoint, QPointF, QEvent,
QRectF
)
# 扫描模式枚举
class ScanMode:
circleScan = 0
sectorScan = 1
# 扫描方向枚举
class ScanDirection:
clockWize = 0
anticlockWize = 1
# 目标信息结构体
class TargetInfoDef:
def __init__(self):
self.sTargetId = ""
self.sTOA = ""
self.dAzimuth = 0.0
self.dPitch = 0.0
self.dDistance = 0.0
self.dFrequency = 0.0
self.dPulseWidth = 0.0
self.dPulseAmplitude = 0.0
self.dPRI = 0.0
self.dRCS = 0.0
self.nAttr = 0
class RadarDetectionWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.timer = QTimer(self)
# 基础绘图参数
self.diameter = 5.0
self.flag = False
self.beamWidth = 360
self.scaleFactor = 1
self.scanRate = 1
self.r = 0
self.g = 0
self.b = 255
# 雷达量程配置
self.pRadius = 300
self.numTurns = 5
self.scanPeriod = 500
self.showTrack = False
# 扫描角度参数
self.pStartAngle = 0
self.pEndAngle = 360
self._start = 0
self._end = 360 – self.beamWidth
# 扫描模式与方向
self.scanModeVal = ScanMode.circleScan
self.scanDirectionVal = ScanDirection.clockWize
# 目标数据缓存
self.targetInfo = TargetInfoDef()
self.targetInfos = []
# 航迹记录 key:targetId value:list[QPoint]
self.record = dict()
# 绘图临时变量
self.coorX = 0
self.coorY = 0
self.minSide = 0
self.measureRadius = 0
self.controlInit()
def controlInit(self):
# 黑色背景
pal = self.palette()
pal.setColor(self.backgroundRole(), Qt.GlobalColor.black)
self.setPalette(pal)
self.setAutoFillBackground(True)
# 自适应拉伸
size_policy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
self.setSizePolicy(size_policy)
# 定时器绑定
self.timer.timeout.connect(self.timerTimeOut)
# 开启扫描
def start(self, nScanPeriod=500):
self.timer.start(nScanPeriod)
# 停止扫描
def stop(self):
self.flag = False
self.timer.stop()
# 初始化雷达基础参数
def init(self, nMaxDetectionDistance=300, nEqualParts=5, nScanPeriod=500, nBeamWidth=10, bShowTrack=False):
self.pRadius = nMaxDetectionDistance
self.numTurns = nEqualParts
self.scanPeriod = nScanPeriod
self.beamWidth = nBeamWidth
self.showTrack = bShowTrack
# 设置是否显示航迹
def setShowTrack(self, bShowTrack=False):
self.showTrack = bShowTrack
# 修改扫描周期
def setScanPeriod(self, nScanPeriod=500):
self.timer.stop()
self.scanPeriod = nScanPeriod
self.timer.start(nScanPeriod)
# 设置扫描模式、方向、波束、起止角度
def setScanParams(self, scanDirectionv=ScanDirection.clockWize, scanModeV=ScanMode.circleScan,
nBeamWidth=10, nStartAngle=0, nEndAngle=360):
self.timer.stop()
self.scanDirectionVal = scanDirectionv
self.scanModeVal = scanModeV
self.beamWidth = nBeamWidth
self.pStartAngle = nStartAngle
self.pEndAngle = nEndAngle
self._start = nStartAngle
self._end = nEndAngle – nBeamWidth
self.timer.start(self.scanPeriod)
# 传入单个目标
def setData(self, ti: TargetInfoDef):
self.targetInfo = ti
# 批量传入目标列表
def setDataList(self, ti_list: list[TargetInfoDef]):
self.targetInfos = ti_list
# 设置航迹颜色 RGB
def setColor(self, r, g, b):
self.r = r
self.g = g
self.b = b
# 定时器刷新角度槽函数
def timerTimeOut(self):
if self.scanModeVal == ScanMode.circleScan:
if self.scanDirectionVal == ScanDirection.clockWize:
if not self.flag:
self.pStartAngle = 90
self.flag = True
self.beamWidth = 360
self.pStartAngle -= self.scanRate
if self.pStartAngle <= –360:
self.pStartAngle = 0
else:
if not self.flag:
self.pStartAngle = 90
self.flag = True
self.beamWidth = 360
self.pStartAngle += self.scanRate
if self.pStartAngle >= 360:
self.pStartAngle = 0
else:
# 扇形扫描来回摆动
self.pStartAngle -= self.scanRate
if self.pStartAngle < self._start or self.pStartAngle > self._end:
self.scanRate *= –1
self.update()
# 绘制方位文字
def drawAzimuth(self, painter: QPainter, x: int, y: int, azimuth: int):
font = QFont("Arial", 16)
painter.setFont(font)
text = f"{azimuth}"
if azimuth == 180:
painter.save()
painter.rotate(180)
painter.drawText(x – 10, (y – 10) * –1, text)
painter.restore()
else:
painter.drawText(x, y, text)
# 绘制量程数字
def drawRange(self, painter: QPainter, x: int, y: int, range_val: int, range1: int):
for i in range(1, self.numTurns + 1):
num = f"{range_val * i}"
off = self.scaleFactor * range1 * i
painter.drawText(x, y + off – 3, num)
painter.drawText(x, y – off + 13, num)
painter.drawText(x + off – 20, y, num)
painter.drawText(x – off, y, num)
# 绘制航迹点连线
def drawPoints(self, painter: QPainter, record_list: list[QPoint]):
p_list = []
for pt in record_list:
x = pt.x() * self.measureRadius / self.pRadius * self.scaleFactor
y = pt.y() * self.measureRadius / self.pRadius * self.scaleFactor
p_list.append(QPointF(x, y))
if len(p_list) > 1:
painter.drawPolyline(p_list)
# 绘制单个目标点+文字标签
def drawTarget(self, painter: QPainter, ti: TargetInfoDef):
if ti.dDistance > self.pRadius:
return
color = QColor(self.r, self.g, self.b)
pen = QPen(color)
painter.setPen(pen)
# 角度换算:0度朝上
rad = math.radians(–ti.dAzimuth + 90)
x1 = self.coorX + ti.dDistance * math.cos(rad)
y1 = self.coorY – ti.dDistance * math.sin(rad)
x2 = x1 – self.coorX
y2 = –(y1 – self.coorY)
pt = QPoint(int(x2), int(–y2))
# 保存航迹
tid = ti.sTargetId
if tid in self.record:
self.record[tid].append(pt)
else:
self.record[tid] = [pt]
sx = x2 * self.scaleFactor
sy = –y2 * self.scaleFactor
painter.drawEllipse(QRectF(sx, sy, self.diameter, self.diameter))
# 绘制航迹线
if self.showTrack:
self.drawPoints(painter, self.record[tid])
# 绘制目标ID文字
font = QFont("Arial", 11)
painter.setFont(font)
painter.setPen(QPen(Qt.GlobalColor.red))
painter.drawText(QPointF(sx, sy), ti.sTargetId)
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
pen_grid = QPen(QColor(128, 255, 0, 250))
painter.setPen(pen_grid)
# 圆心坐标
w = self.width()
h = self.height()
self.coorX = w // 2
self.coorY = h // 2
self.minSide = min(w, h) – 50
self.measureRadius = self.minSide // 2
range_unit = self.pRadius / self.numTurns
range1_unit = self.measureRadius / self.numTurns
center_pt = QPointF(self.coorX, self.coorY)
# 绘制多层同心圆
for i in range(self.numTurns):
r = self.scaleFactor * (self.measureRadius – range1_unit * i)
painter.drawEllipse(center_pt, r, r)
# 绘制量程文字
self.drawRange(painter, self.coorX, self.coorY, int(range_unit), int(range1_unit))
# 切换坐标系到圆心,绘制外圈刻度
painter.save()
painter.translate(self.coorX, self.coorY)
painter.setPen(QPen(QColor(255, 255, 0, 250)))
painter.setFont(QFont("Calibri", 10))
# 1度小刻度
for _ in range(360):
painter.rotate(1)
painter.drawLine(0, –self.scaleFactor * self.measureRadius,
0, –self.scaleFactor * self.measureRadius + 5)
# 5度中刻度
for _ in range(72):
painter.rotate(5)
painter.drawLine(0, –self.scaleFactor * self.measureRadius,
0, –self.scaleFactor * self.measureRadius + 8)
# 10度大刻度
for _ in range(36):
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
painter.rotate(10)
painter.drawLine(0, –self.scaleFactor * self.measureRadius,
0, –self.scaleFactor * self.measureRadius + 12)
# 四个方位 0/90/180/270
for i in range(4):
painter.drawLine(0, 0, 0, –self.scaleFactor * self.measureRadius)
self.drawAzimuth(painter, –10, –self.scaleFactor * self.measureRadius – 10, i * 90)
painter.rotate(90)
painter.restore()
painter.setPen(Qt.PenStyle.NoPen)
# 绘制扫描扇区
rect_outer = QRectF(
self.coorX – self.scaleFactor * self.measureRadius,
self.coorY – self.scaleFactor * self.measureRadius,
self.scaleFactor * self.measureRadius * 2,
self.scaleFactor * self.measureRadius * 2
)
if self.scanModeVal == ScanMode.circleScan:
grad = QConicalGradient(QPointF(self.coorX, self.coorY), self.pStartAngle)
if self.scanDirectionVal == ScanDirection.clockWize:
grad.setColorAt(0.1, QColor(128, 255, 0, 150))
grad.setColorAt(0.9, QColor(0, 255, 0, 0))
else:
grad.setColorAt(0.9, QColor(128, 255, 0, 150))
grad.setColorAt(0.1, QColor(0, 255, 0, 0))
painter.setBrush(QBrush(grad))
painter.drawPie(rect_outer, –self.pStartAngle * 16, self.beamWidth * 16)
else:
painter.setBrush(QBrush(QColor(128, 255, 0, 150)))
trans = QTransform()
trans.translate(self.coorX, self.coorY)
trans.rotate(–90)
painter.setTransform(trans)
painter.drawPie(rect_outer, –self.pStartAngle * 16, –self.beamWidth * 16)
painter.resetTransform()
# 绘制目标
painter.translate(self.coorX, self.coorY)
painter.setBrush(QBrush(QColor(50, 255, 200, 200)))
# 单个目标
if self.targetInfo.sTargetId != "":
self.drawTarget(painter, self.targetInfo)
# 批量目标
for target in self.targetInfos:
self.drawTarget(painter, target)
# 窗口缩放刷新
def resizeEvent(self, event):
self.update()
# 滚轮缩放
def wheelEvent(self, event):
delta_y = event.angleDelta().y()
step = 1
if delta_y > 0:
self.scaleFactor += step
else:
self.scaleFactor -= step
# 限制缩放区间
if self.scaleFactor < 1:
self.scaleFactor = 1
if self.scaleFactor > 5:
self.scaleFactor = 5
self.update()
# 鼠标点击弹出Tooltip距离方位
def mousePressEvent(self, event):
if event.button() == Qt.MouseButton.LeftButton:
mx = event.pos().x()
my = event.pos().y()
self.minSide = min(self.width(), self.height()) – 50
self.measureRadius = self.minSide // 2
# 计算距离
dx = mx – self.coorX
dy = my – self.coorY
dist_pixel = math.hypot(dx, dy)
real_dist = dist_pixel * self.pRadius / self.measureRadius / self.scaleFactor
# 计算方位角
az_rad = math.atan2(dy, dx)
az_deg = math.degrees(az_rad)
# 弹出提示文字
tip_pos = self.mapToGlobal(event.pos())
tip_pos.setX(tip_pos.x() – 20)
tip_pos.setY(tip_pos.y() – 50)
if –180 < az_deg < –90:
tip_text = f"距离: {real_dist:.1f}\\n方位: {az_deg + 450:.1f}"
else:
tip_text = f"距离: {real_dist:.1f}\\n方位: {az_deg + 90:.1f}"
QToolTip.showText(tip_pos, tip_text, self)
# 测试窗口
if __name__ == "__main__":
app = QApplication(sys.argv)
win = RadarDetectionWidget()
win.resize(600, 600)
win.init(nMaxDetectionDistance=300, nEqualParts=5, nScanPeriod=300, nBeamWidth=15, bShowTrack=True)
win.setScanParams(ScanDirection.clockWize, ScanMode.circleScan, 10, 0, 360)
# 模拟添加测试目标
t1 = TargetInfoDef()
t1.sTargetId = "T001"
t1.dAzimuth = 30
t1.dDistance = 120
t2 = TargetInfoDef()
t2.sTargetId = "T002"
t2.dAzimuth = 120
t2.dDistance = 180
win.setDataList([t1, t2])
win.setColor(255, 80, 80)
win.start(20)
win.show()
sys.exit(app.exec())
3、软件包安装

二、QPainter详解
1、 引言
QPainter 是 PyQt6 中用于执行绘图操作的核心类,它提供了丰富的 API 来绘制各种图形、文本和图像。无论是创建自定义控件、绘制图表,还是实现复杂的图形界面,QPainter 都是不可或缺的工具。本文将深入探讨 QPainter 的各个方面,从基础概念到高级应用,帮助您全面掌握这一强大的绘图引擎。
2、 QPainter 基础概念
2.1、 什么是 QPainter?
QPainter 是 Qt 框架中的绘图引擎,它可以在各种绘图设备上执行绘制操作,包括:
- QWidget:在窗口部件上绘制
- QPixmap:在位图上绘制
- QImage:在图像上绘制
- QPrinter:在打印机上绘制
2.2、 坐标系系统
QPainter 使用笛卡尔坐标系,原点 (0,0) 默认位于绘制设备的左上角:
- X 轴向右为正方向
- Y 轴向下为正方向
- 坐标单位通常是像素
2.3、 绘图设备与绘图上下文
在使用 QPainter 之前,必须将其与一个绘图设备关联:
# 在 QWidget 上绘制
painter = QPainter(self)
# 在 QPixmap 上绘制
pixmap = QPixmap(400, 300)
painter = QPainter(pixmap)
# 在 QImage 上绘制
image = QImage(400, 300, QImage.Format.Format_ARGB32)
painter = QPainter(image)
3、基本绘图操作
3.1 、绘制基本图形
def paintEvent(self, event):
painter = QPainter(self)
# 设置画笔(轮廓)
pen = QPen(QColor(255, 0, 0)) # 红色
pen.setWidth(3)
painter.setPen(pen)
# 设置画刷(填充)
brush = QBrush(QColor(0, 255, 0, 100)) # 半透明绿色
painter.setBrush(brush)
# 绘制矩形
painter.drawRect(50, 50, 200, 100)
# 绘制椭圆
painter.drawEllipse(100, 200, 150, 100)
# 绘制直线
painter.drawLine(10, 10, 300, 10)
# 绘制多边形
points = [
QPoint(200, 200),
QPoint(250, 150),
QPoint(300, 200),
QPoint(250, 250)
]
polygon = QPolygon(points)
painter.drawPolygon(polygon)
3.2、 绘制文本
def paintEvent(self, event):
painter = QPainter(self)
# 设置字体
font = QFont("Arial", 16, QFont.Weight.Bold)
painter.setFont(font)
# 设置文本颜色
painter.setPen(QColor(0, 0, 255))
# 绘制文本
painter.drawText(50, 50, "Hello, PyQt6!")
# 带格式的文本绘制
text_rect = QRect(50, 100, 300, 100)
painter.drawText(text_rect, Qt.AlignmentFlag.AlignCenter, "居中文本")
# 多行文本
multi_line_rect = QRect(50, 200, 300, 150)
painter.drawText(multi_line_rect,
Qt.TextFlag.TextWordWrap,
"这是多行文本示例\\n第二行内容")
3.3、 绘制图像
def paintEvent(self, event):
painter = QPainter(self)
# 加载图像
image = QImage("example.png")
if not image.isNull():
# 直接绘制
painter.drawImage(50, 50, image)
# 缩放绘制
scaled_rect = QRect(200, 50, 150, 150)
painter.drawImage(scaled_rect, image)
# 绘制部分图像
source_rect = QRect(0, 0, 100, 100) # 源图像区域
target_rect = QRect(50, 200, 200, 200) # 目标区域
painter.drawImage(target_rect, image, source_rect)
4、 画笔与画刷详解
4.1 、QPen:控制轮廓样式
def paintEvent(self, event):
painter = QPainter(self)
# 创建不同样式的画笔
pens = []
# 实线
solid_pen = QPen(QColor(255, 0, 0))
solid_pen.setStyle(Qt.PenStyle.SolidLine)
solid_pen.setWidth(2)
# 虚线
dash_pen = QPen(QColor(0, 255, 0))
dash_pen.setStyle(Qt.PenStyle.DashLine)
dash_pen.setWidth(3)
# 点线
dot_pen = QPen(QColor(0, 0, 255))
dot_pen.setStyle(Qt.PenStyle.DotLine)
dot_pen.setWidth(1)
# 自定义虚线模式
custom_pen = QPen(QColor(255, 128, 0))
custom_pen.setDashPattern([5, 3, 2, 3]) # 5像素实线,3像素空白,2像素实线,3像素空白
# 线帽样式
pen_with_cap = QPen(QColor(128, 0, 255))
pen_with_cap.setCapStyle(Qt.PenCapStyle.RoundCap)
# 连接点样式
pen_with_join = QPen(QColor(0, 128, 255))
pen_with_join.setJoinStyle(Qt.PenJoinStyle.RoundJoin)
4.2、 QBrush:控制填充样式
def paintEvent(self, event):
painter = QPainter(self)
# 纯色填充
solid_brush = QBrush(QColor(255, 200, 200))
# 渐变填充
gradient = QLinearGradient(0, 0, 300, 300)
gradient.setColorAt(0, QColor(255, 0, 0))
gradient.setColorAt(0.5, QColor(0, 255, 0))
gradient.setColorAt(1, QColor(0, 0, 255))
gradient_brush = QBrush(gradient)
# 径向渐变
radial_gradient = QRadialGradient(150, 150, 100)
radial_gradient.setColorAt(0, QColor(255, 255, 0))
radial_gradient.setColorAt(1, QColor(255, 0, 0))
radial_brush = QBrush(radial_gradient)
# 纹理填充
texture_image = QImage("texture.png")
texture_brush = QBrush(texture_image)
# 图案填充
pattern_brush = QBrush(Qt.BrushStyle.DiagCrossPattern)
pattern_brush.setColor(QColor(200, 200, 255))
5、 坐标变换与视图操作
5.1 、基本变换操作
def paintEvent(self, event):
painter = QPainter(self)
# 保存当前状态
painter.save()
# 平移
painter.translate(100, 100)
# 旋转(以原点为中心)
painter.rotate(45) # 45度
# 缩放
painter.scale(2.0, 1.5) # X轴放大2倍,Y轴放大1.5倍
# 绘制变换后的图形
painter.drawRect(0, 0, 50, 50)
# 恢复之前的状态
painter.restore()
# 继续使用原始坐标系绘制
painter.drawRect(0, 0, 50, 50)
5.2 、视图与窗口映射
def paintEvent(self, event):
painter = QPainter(self)
# 设置窗口(逻辑坐标)
painter.setWindow(–100, –100, 200, 200)
# 设置视口(物理坐标)
painter.setViewport(50, 50, 300, 300)
# 现在 (-100,-100) 映射到 (50,50)
# (100,100) 映射到 (350,350)
# 绘制使用逻辑坐标
painter.drawRect(–50, –50, 100, 100)
5.3、 组合变换
def paintEvent(self, event):
painter = QPainter(self)
# 创建变换矩阵
transform = QTransform()
# 应用多个变换
transform.translate(150, 150) # 平移到中心
transform.rotate(30) # 旋转30度
transform.scale(1.5, 1.0) # X轴缩放
# 设置变换
painter.setTransform(transform)
# 绘制
painter.drawRect(–25, –25, 50, 50)
6、高级绘图功能
6.1 、路径绘制(QPainterPath)
def paintEvent(self, event):
painter = QPainter(self)
# 创建路径
path = QPainterPath()
# 移动到起点
path.moveTo(50, 50)
# 添加直线
path.lineTo(150, 50)
# 添加二次贝塞尔曲线
path.quadTo(200, 100, 150, 150)
# 添加三次贝塞尔曲线
path.cubicTo(100, 200, 200, 200, 50, 150)
# 闭合路径
path.closeSubpath()
# 绘制路径
painter.drawPath(path)
# 填充路径
painter.fillPath(path, QColor(255, 200, 200, 128))
6.2、 抗锯齿与渲染提示
def paintEvent(self, event):
painter = QPainter(self)
# 启用抗锯齿
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
# 启用文本抗锯齿
painter.setRenderHint(QPainter.RenderHint.TextAntialiasing)
# 启用平滑的像素图变换
painter.setRenderHint(QPainter.RenderHint.SmoothPixmapTransform)
# 绘制平滑图形
painter.drawEllipse(100, 100, 150, 150)
# 禁用抗锯齿(性能优化)
painter.setRenderHint(QPainter.RenderHint.Antialiasing, False)
6.3、 合成模式
def paintEvent(self, event):
painter = QPainter(self)
# 绘制背景
painter.fillRect(0, 0, 300, 300, QColor(100, 150, 200))
# 设置合成模式
painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_SourceOver) # 默认
painter.fillRect(50, 50, 100, 100, QColor(255, 0, 0, 128))
painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Multiply) # 正片叠底
painter.fillRect(100, 100, 100, 100, QColor(0, 255, 0, 128))
painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Screen) # 滤色
painter.fillRect(150, 150, 100, 100, QColor(0, 0, 255, 128))
7、相关API介绍
QPainter 提供了丰富的绘制方法,涵盖了图形、文本、图像、路径等多种绘制需求。以下是按功能分类的主要方法列表:
7.1、 基本图形绘制方法
绘制点
- drawPoint(x, y) – 在指定坐标绘制单个点
- drawPoint(point) – 使用 QPoint 对象绘制点
- drawPoints(points) – 绘制多个点(QPoint 列表或数组)
绘制直线
- drawLine(x1, y1, x2, y2) – 从 (x1,y1) 到 (x2,y2) 绘制直线
- drawLine(line) – 使用 QLine 对象绘制直线
- drawLines(lines) – 绘制多条直线
绘制矩形
- drawRect(x, y, width, height) – 绘制矩形
- drawRect(rect) – 使用 QRect 对象绘制矩形
- drawRoundedRect(rect, xRadius, yRadius) – 绘制圆角矩形
绘制椭圆和圆
- drawEllipse(x, y, width, height) – 绘制椭圆
- drawEllipse(rect) – 在矩形边界内绘制椭圆
- drawEllipse(center, rx, ry) – 以中心点绘制椭圆
- drawEllipse(center, radius) – 绘制圆形
绘制多边形
- drawPolygon(points) – 绘制多边形(自动闭合)
- drawPolyline(points) – 绘制折线(不闭合)
- drawConvexPolygon(points) – 绘制凸多边形(性能优化)
绘制弧线、弦和扇形
- drawArc(rect, startAngle, spanAngle) – 绘制弧线
- drawChord(rect, startAngle, spanAngle) – 绘制弦
- drawPie(rect, startAngle, spanAngle) – 绘制扇形
7.2、 文本绘制方法
简单文本绘制
- drawText(x, y, text) – 在指定位置绘制文本
- drawText(point, text) – 使用 QPoint 指定位置
矩形内文本绘制
- drawText(rect, flags, text) – 在矩形内绘制文本,可指定对齐方式
- drawText(rect, text) – 在矩形内绘制文本(自动换行)
高级文本绘制
- drawStaticText(x, y, staticText) – 绘制静态文本(性能优化)
- drawStaticText(point, staticText) – 使用 QPoint 绘制静态文本
- drawTextItem(position, textItem) – 绘制文本项(支持复杂格式)
7.3、 图像绘制方法
基本图像绘制
- drawImage(x, y, image) – 在指定位置绘制图像
- drawImage(point, image) – 使用 QPoint 指定位置
- drawImage(targetRect, image) – 在目标矩形内绘制(自动缩放)
部分图像绘制
- drawImage(targetRect, image, sourceRect) – 绘制图像的一部分
- drawImage(targetPoint, image, sourceRect) – 在目标点绘制部分图像
Pixmap 绘制
- drawPixmap(x, y, pixmap) – 绘制 QPixmap
- drawPixmap(point, pixmap) – 使用 QPoint 绘制
- drawPixmap(rect, pixmap) – 在矩形内绘制
- drawPixmap(targetRect, pixmap, sourceRect) – 绘制部分 pixmap
7.4、 路径绘制方法
路径操作
- drawPath(path) – 绘制 QPainterPath
- fillPath(path, brush) – 填充路径
- strokePath(path, pen) – 使用画笔描边路径
路径绘制快捷方法
- drawLine(path) – 绘制路径的线条部分
- drawPolygon(path) – 绘制路径的多边形部分
7.5、 填充和背景方法
区域填充
- fillRect(rect, brush) – 使用画刷填充矩形
- fillRect(rect, color) – 使用颜色填充矩形
- fillRect(x, y, width, height, brush) – 指定坐标填充
背景清除
- eraseRect(rect) – 清除矩形区域(使用背景画刷)
- eraseRect(x, y, width, height) – 指定坐标清除
渐变填充
- fillRect(rect, gradient) – 使用渐变填充矩形
7.6、 变换和状态方法
坐标变换
- translate(dx, dy) – 平移坐标系
- rotate(angle) – 旋转坐标系
- scale(sx, sy) – 缩放坐标系
- shear(sh, sv) – 剪切变换
- setTransform(transform) – 设置变换矩阵
- setWorldTransform(transform) – 设置世界变换
状态管理
- save() – 保存当前绘图状态
- restore() – 恢复之前保存的状态
- resetTransform() – 重置所有变换
视图和窗口
- setViewport(rect) – 设置视口矩形
- setWindow(rect) – 设置窗口矩形
- setViewTransformEnabled(enabled) – 启用/禁用视图变换
7.7、 样式和属性设置方法
画笔和画刷
- setPen(pen) – 设置画笔
- setBrush(brush) – 设置画刷
- setBackground(brush) – 设置背景画刷
- setBackgroundMode(mode) – 设置背景模式
字体和文本
- setFont(font) – 设置字体
- setFontMetrics(fontMetrics) – 设置字体度量
渲染提示
- setRenderHint(hint, enabled=true) – 设置渲染提示
- renderHints() – 获取当前渲染提示
合成模式
- setCompositionMode(mode) – 设置合成模式
7.8、 辅助方法
裁剪区域
- setClipRect(rect) – 设置矩形裁剪区域
- setClipPath(path) – 设置路径裁剪区域
- setClipRegion(region) – 设置区域裁剪
- setClipping(enabled) – 启用/禁用裁剪
绘制设备
- begin(device) – 开始在设备上绘制
- end() – 结束绘制
- isActive() – 检查是否正在绘制
坐标转换
- deviceTransform() – 获取设备变换矩阵
- worldTransform() – 获取世界变换矩阵
- transform() – 获取当前变换

