欢迎光临
我们一直在努力

PyQt 使用QPainter绘制雷达扫描效果源码分享

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() – 获取当前变换

在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » PyQt 使用QPainter绘制雷达扫描效果源码分享
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址