PyQt5绘图全攻略:QPainter、QPen、QBrush与QPixmap详解

摘要:掌握PyQt5绘图核心控件,轻松实现窗体绘图、文字渲染、几何图形绘制及图像加载。本文附带完整代码示例与效果图,助你快速上手GUI图形开发。

绘图基础:为什么需要这些控件?

在GUI开发中,绘图功能是数据可视化、游戏开发、图像编辑等场景的核心需求。PyQt5通过以下四大类实现绘图:

  • QPainter:绘图引擎,执行底层绘制操作
  • QPen:控制线条样式(颜色/粗细/虚线等)
  • QBrush:控制填充样式(纯色/渐变/图案)
  • QPixmap :图像加载与渲染
    📌 关键特性:所有绘图操作必须在paintEvent()事件中完成,通过begin()和end()方法包裹。

核心控件详解与实战

QPainter:绘图引擎

核心能力

python 复制代码
def paintEvent(self, event):
    painter = QPainter(self)
    painter.begin(self) 
    # 绘制操作...
    painter.end() 

常用方法速查表:

方法 功能 示例
drawText() 文字渲染 painter.drawText(rect, alignment, "文本")
drawEllipse() 绘制椭圆 painter.drawEllipse(x, y, w, h)
fillRect() 矩形填充 painter.fillRect(rect, QColor(255,0,0))

文字绘制示例

python 复制代码
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPainter,QColor,QFont
from PyQt5.QtCore import Qt

class Drawing(QWidget):
    def __init__(self,parent=None):
        super(Drawing,self).__init__(parent)
        self.setWindowTitle("在窗体中绘画出文字例子")
        self.resize(300,200)
        self.text='欢迎学习 PyQt5'

    def paintEvent(self,event):
        painter=QPainter(self)
        painter.begin(self)
        # 自定义的绘画方法
        self.drawText(event,painter)
        painter.end()

    def drawText(self,event,qp):
        #设置笔的颜色
        qp.setPen(QColor(168,34,3))
        #设置字体
        qp.setFont(QFont('SimSun',20))
        #画出文本
        qp.drawText(event.rect(),Qt.AlignCenter,self.text)

if __name__ == '__main__':
    app=QApplication(sys.argv)
    demo=Drawing()
    demo.show()
    sys.exit(app.exec_())

运行效果

QPen:线条控制大师

6种预定义线型对比:

  • Qt.SolidLine:实线(默认)
  • Qt.DashLine:虚线
  • Qt.DotLine:点线
  • Qt.DashDotLine:点划线
  • Qt.DashDotDotLine:双点划线
  • Qt.CustomDashLine:自定义模式

自定义虚线技巧:

python 复制代码
pen = QPen(Qt.red,  3)
pen.setStyle(Qt.CustomDashLine) 
pen.setDashPattern([5,  2, 1, 2])  # 5px实线+2px空白+1px实线+2px空白 

QBrush:填充艺术家

9种经典填充模式:

python 复制代码
# 示例:创建不同填充样式的矩形 
patterns = [
    Qt.SolidPattern,      # 纯色填充 
    Qt.Dense5Pattern,     # 密集斜线 
    Qt.DiagCrossPattern,  # 交叉网格 
    Qt.HorPattern,        # 水平线 
    Qt.VerPattern,        # 垂直线 
    Qt.BDiagPattern       # 反斜线 
]

渐变填充进阶(需配合QLinearGradient):

python 复制代码
gradient = QLinearGradient(0, 0, 100, 100)
gradient.setColorAt(0,  Qt.blue) 
gradient.setColorAt(1,  Qt.white) 
brush = QBrush(gradient)

QPixmap:图像处理专家

核心功能对比

方法 与QImage区别 适用场景
load() 专为显示优化 界面图片加载
scaled() 保持宽高比缩放 缩略图生成
save() 支持压缩格式 截图保存

图像加载最佳实践:

自适应标签大小的图像加载

python 复制代码
pixmap = QPixmap("image.jpg") 
pixmap = pixmap.scaled( 
    label.size(),  
    Qt.KeepAspectRatio,
    Qt.SmoothTransformation 
)
label.setPixmap(pixmap) 

性能优化建议

  • 双缓冲技术:通过QPixmap缓存绘制结果,避免闪烁
  • 局部重绘:使用update(QRect)而非全局刷新
  • 资源复用:重复使用的QPen/QBrush建议设为成员变量

完整项目示例

简易画板实现思路:

  • 继承QWidget重写mouseMoveEvent
  • 使用QPainterPath记录笔迹
  • 通过QPixmap保存画布状态
python 复制代码
class SketchWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.path  = QPainterPath()
        self.pen  = QPen(Qt.blue,  3, Qt.SolidLine)
        
    def mouseMoveEvent(self, event):
        self.path.lineTo(event.pos()) 
        self.update() 

📢 互动提问:你在PyQt5绘图时遇到过哪些难题?欢迎在评论区留言讨论!

相关推荐
啊吧怪不啊吧8 小时前
LangChain之模型调用
python·langchain
溪语流沙8 小时前
Django + Vue电商项目第001讲:开篇|注册登录加增删改查,那不是电商
redis·python·mysql·docker·typescript·django·vue
夜雪一千9 小时前
如何使用BeautifulSoup库来提取HTML中的特定元素
python
IT毕设梦工厂9 小时前
计算机毕业设计选题推荐:基于大数据的城市空气污染物浓度数据分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·python·信息可视化·数据挖掘·数据分析·课程设计·数据可视化
程序员阿黄9 小时前
基于 Django 与 Vue 3 的智能实验室预约系统设计与实现
后端·python·mysql·django·vue·毕设
实心儿儿9 小时前
Qt — 信号和槽
qt
用户298698530149 小时前
Python 如何实现 Word 与 RTF 文档互转
后端·python·api
程序猿在线码字9 小时前
深度学习(一)
python·深度学习·神经网络·机器学习
打工仔折腾 AI9 小时前
用 Shell 脚本自动部署 mysqld_exporter 并接入 Prometheus 远程抓取
人工智能·后端·python·性能优化·ai agent 实战
梦想不只是梦与想9 小时前
环境管理:Conda 与 venv
python·conda·uv