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绘图时遇到过哪些难题?欢迎在评论区留言讨论!

相关推荐
布局呆星5 分钟前
SQLite数据库的介绍与使用
数据库·python
2401_838472516 分钟前
用Python和Twilio构建短信通知系统
jvm·数据库·python
weixin_4521595513 分钟前
如何从Python初学者进阶为专家?
jvm·数据库·python
Hello.Reader15 分钟前
面向 403 与域名频繁变更的合规爬虫工程实践以 Libvio 系站点为例
爬虫·python·网络爬虫
深蓝海拓28 分钟前
PySide6从0开始学习的笔记(二十五) Qt窗口对象的生命周期和及时销毁
笔记·python·qt·学习·pyqt
Dfreedom.38 分钟前
开运算与闭运算:图像形态学中的“清道夫”与“修复匠”
图像处理·python·opencv·开运算·闭运算
2301_7903009642 分钟前
用Python读取和处理NASA公开API数据
jvm·数据库·python
葱明撅腚1 小时前
利用Python挖掘城市数据
python·算法·gis·聚类
Serendipity_Carl1 小时前
1637加盟网数据实战(数分可视化)
爬虫·python·pycharm·数据可视化·数据清洗
2501_944448001 小时前
Flutter for OpenHarmony衣橱管家App实战:统计分析实现
flutter·信息可视化