使用 Python Qt5 的 QPainter 实现 2D 图形绘制,包括基础图形(直线、矩形、圆形)、填充效果、文字绘制等核心功能,并提供一个完整可运行的示例程序。
核心实现思路
- 继承
QWidget 自定义绘图控件,重写 paintEvent 方法(Qt 的绘图入口) - 在
paintEvent 中创建 QPainter 对象,设置画笔(QPen)、画刷(QBrush)等样式 - 使用
QPainter 的绘图方法绘制各类 2D 图形
完整示例代码
import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QMainWindowfrom PyQt5.QtGui import QPainter, QPen, QBrush, QColor, QFontfrom PyQt5.QtCore import Qt, QPointclassDrawWidget(QWidget):"""自定义绘图控件,所有2D图形都在这里绘制"""defpaintEvent(self, event):# 1. 创建QPainter对象,指定绘制设备为当前控件 painter = QPainter(self)# 开启抗锯齿,让图形边缘更平滑 painter.setRenderHint(QPainter.Antialiasing)# ---------------------- 1. 绘制基础线条 ----------------------# 设置画笔:红色、宽度3、实线样式 pen = QPen(QColor(255, 0, 0), 3, Qt.SolidLine) painter.setPen(pen)# 绘制直线:从(50, 50)到(200, 50) painter.drawLine(50, 50, 200, 50)# 绘制虚线 pen.setStyle(Qt.DashLine) pen.setColor(QColor(0, 0, 255)) # 蓝色 painter.setPen(pen) painter.drawLine(50, 80, 200, 80)# ---------------------- 2. 绘制几何图形 ----------------------# 绘制矩形(无填充) pen.setStyle(Qt.SolidLine) pen.setColor(QColor(0, 255, 0)) # 绿色 painter.setPen(pen) painter.drawRect(50, 110, 150, 80) # x, y, width, height# 绘制填充矩形 brush = QBrush(QColor(255, 255, 0, 100)) # 黄色,透明度100 painter.setBrush(brush) painter.drawRect(220, 110, 150, 80)# 绘制圆形(椭圆的特殊形式:宽高相等) pen.setColor(QColor(128, 0, 128)) # 紫色 painter.setPen(pen) painter.setBrush(QBrush(Qt.CrossPattern)) # 交叉填充样式 painter.drawEllipse(50, 220, 100, 100) # x, y, width, height# 绘制椭圆 painter.setBrush(QBrush(QColor(255, 165, 0))) # 橙色实心 painter.drawEllipse(180, 220, 120, 80)# ---------------------- 3. 绘制多边形 ----------------------# 定义多边形顶点 points = [ QPoint(50, 350), QPoint(120, 320), QPoint(180, 350), QPoint(150, 420), QPoint(80, 400) ] pen.setColor(QColor(0, 128, 128)) # 青绿色 painter.setPen(pen) painter.setBrush(QBrush(QColor(0, 128, 128, 80))) # 半透明青绿色 painter.drawPolygon(points)# ---------------------- 4. 绘制文字 ----------------------# 设置字体 font = QFont("微软雅黑", 14, QFont.Bold) painter.setFont(font) painter.setPen(QColor(0, 0, 0)) # 黑色文字 painter.drawText(50, 480, "Qt5 QPainter 2D图形绘制示例")classMainWindow(QMainWindow):"""主窗口"""def__init__(self): super().__init__()# 设置窗口属性 self.setWindowTitle("Qt5 2D图形绘制") self.setGeometry(100, 100, 800, 600) # x, y, width, height# 创建自定义绘图控件并设为中心窗口 self.draw_widget = DrawWidget() self.setCentralWidget(self.draw_widget)if __name__ == "__main__":# 初始化Qt应用 app = QApplication(sys.argv)# 创建并显示主窗口 window = MainWindow() window.show()# 运行应用事件循环 sys.exit(app.exec_())
代码关键部分解释
- 重写
paintEvent 方法:这是 Qt 绘图的核心入口,当控件需要重绘(如窗口刷新、大小变化)时会自动调用 painter.setRenderHint(QPainter.Antialiasing):开启抗锯齿,避免图形边缘出现锯齿状,提升视觉效果
QPen:控制图形的轮廓样式(颜色、宽度、线条样式:实线/虚线等)QBrush:控制图形的填充效果(纯色、渐变、图案填充等)
drawLine(x1, y1, x2, y2):绘制直线drawRect(x, y, w, h):绘制矩形drawEllipse(x, y, w, h):绘制椭圆(w=h 时为圆形)drawPolygon(points):绘制多边形drawText(x, y, text):绘制文字
- Qt 绘图的坐标原点在控件左上角,x 轴向右,y 轴向下
运行前置条件
pip install PyQt5
- 运行代码:直接执行脚本,会弹出一个窗口,显示各类绘制的2D图形
总结
- Qt5 中使用
QPainter 绘制2D图形的核心是重写控件的 paintEvent 方法,在其中创建 QPainter 对象并调用绘图方法。 QPen 控制图形轮廓样式,QBrush 控制填充效果,两者配合可实现丰富的视觉效果。- 常用绘图方法包括
drawLine、drawRect、drawEllipse、drawPolygon、drawText 等,覆盖大部分2D图形绘制需求。