pyqt5与matplotlib完美结合

本文介绍如何使用PyQt5和Matplotlib在GUI中动态绘制图表,通过实例展示了如何创建窗口、按钮并响应点击事件来更新图表。

具体用到了matplotlib.backends.backend_qt5agg.FigureCanvasQTAgg

直接上代码(这里给出的只是一个简单的框架,告诉你怎么去写):

# -*- coding: utf-8 -*-
'''
TODO:LQD
'''
import sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FC
from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, QVBoxLayout, QWidget


class QtDraw(QMainWindow):
    flag_btn_start = True

    def __init__(self):
        super(QtDraw, self).__init__()
        self.init_ui()

    def init_ui(self):
        self.resize(800, 600)
        self.setWindowTitle('PyQt5 Draw')

        # TODO:这里是结合的关键
        self.fig = plt.Figure()
        self.canvas = FC(self.fig)
        self.btn_start = QPushButton(self)
        self.btn_start.setText('draw')
        self.btn_start.clicked.connect(self.slot_btn_start)

        widget = QWidget()
        layout = QVBoxLayout()
        layout.addWidget(self.canvas)
        layout.addWidget(self.btn_start)
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def slot_btn_start(self):
        try:
            ax = self.fig.add_subplot(111)
            x = np.linspace(0, 100, 100)
            y = np.random.random(100)
            ax.cla()  # TODO:删除原图,让画布上只有新的一次的图
            ax.plot(x, y)
            self.canvas.draw()  # TODO:这里开始绘制
        except Exception as e:
            print(e)


def ui_main():
    app = QApplication(sys.argv)
    w = QtDraw()
    w.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    ui_main()

 

`C++ Qt` 和 `PyQt5` 都是基于 **Qt 框架** 的开发工具,用于创建跨平台的图形用户界面(GUI)应用程序。但它们在语言、性能、使用方式和许可等方面有显著区别。 --- ## ✅ 一、核心区别概览 | 特性 | C++ Qt | PyQt5 | |------|--------|-------| | 编程语言 | C++ | Python | | 性能 | 高(编译型,原生执行) | 较低(解释型,通过绑定调用) | | 开发效率 | 中等(需编译、手动内存管理) | 高(动态类型、快速原型开发) | | 学习曲线 | 较陡峭 | 平缓(适合初学者) | | 许可协议 | LGPL / 商业(可闭源) | GPL / 商业(免费版不能闭源) | | 绑定机制 | 原生框架 | Python 对 C++ Qt 的封装(SIP) | | 跨平台支持 | Windows, Linux, macOS, 嵌入式等 | 同上(依赖 Python 环境) | | 可部署性 | 单独可执行文件(静态/动态链接) | 需打包 Python 解释器(如 PyInstaller) | --- ## ✅ 二、详细对比 ### 1. **编程语言运行环境** - **C++ Qt**: - 使用 C++ 编写。 - 直接调用 Qt 库函数,编译成机器码。 - 必须使用 `qmake` 或 `CMake` 构建系统。 - 示例代码: ```cpp #include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label("Hello from C++ Qt!"); label.show(); return app.exec(); } ``` - **PyQt5**: - 使用 Python 编写。 - 通过 SIP 工具将 C++ Qt 封装为 Python 模块。 - 不需要编译,直接运行 `.py` 文件。 - 示例代码: ```python import sys from PyQt5.QtWidgets import QApplication, QLabel app = QApplication(sys.argv) label = QLabel("Hello from PyQt5!") label.show() sys.exit(app.exec_()) ``` > 🔍 可见:PyQt5 更简洁,适合快速开发;C++ Qt 更底层,控制力更强。 --- ### 2. **性能对比** | 场景 | C++ Qt | PyQt5 | |------|--------|-------| | 启动速度 | 快(原生二进制) | 慢(需启动 Python 解释器) | | 内存占用 | 小 | 大(Python 运行时 + Qt 绑定) | | 图形渲染 | 直接调用 GPU 加速 | 间接调用,略有开销 | | 多线程处理 | 强大且高效 | GIL 限制并发能力 | 📌 结论:对性能敏感的应用(如实时数据可视化、游戏、嵌入式设备),推荐使用 **C++ Qt**。 --- ### 3. **开发效率学习成本** - **PyQt5 优势**: - 动态类型、无需头文件、自动垃圾回收。 - 适合教学、脚本化 GUI 工具、小型项目。 - 可快速集成 NumPy、Matplotlib、Pandas 等科学计算库。 - **C++ Qt 优势**: - 更精细的资源控制(指针、RAII、信号槽优化)。 - 更适合大型工程、团队协作、长期维护项目。 - 支持模板、STL、现代 C++ 特性(C++17/20)。 --- ### 4. **许可证问题(非常重要!)** | 项目 | 许可证 | 是否允许闭源商业软件? | |------|--------|--------------------------| | **C++ Qt (LGPL)** | LGPL v3 | ✅ 允许(动态链接即可) | | **PyQt5 (Riverbank Software)** | GPL v3 或 商业许可证 | ❌ GPL 下不允许闭源;✅ 商业授权可以 | > ⚠️ 注意:如果你要开发**闭源商业软件**,使用 PyQt5 必须购买商业许可证(价格较高),否则违反 GPL。 替代方案:考虑使用 [**PySide2 / PySide6**](https://wiki.qt.io/Qt_for_Python)(由 Qt 官方维护,采用 **LGPL** 协议,允许闭源!) 示例(PySide6): ```python from PySide6.QtWidgets import QApplication, QLabel app = QApplication() label = QLabel("Hello from PySide6!") label.show() app.exec() ``` 👉 推荐:**优先使用 PySide6 替代 PyQt5**,避免许可风险。 --- ### 5. **生态系统工具支持** | 方面 | C++ Qt | PyQt5 / PySide | |------|--------|----------------| | Qt Creator 支持 | 完美支持(UI 设计、调试、Kits) | 支持有限(主要是代码编辑) | | UI 设计(`.ui` 文件) | `.ui` → `uic` 转换为 C++ 类 | `.ui` → `uic` 转换为 Python 代码或动态加载 | | 调试工具 | gdb, lldb, Qt Creator 内置调试器 | pdb, IDE 断点调试(如 VS Code) | | 第三方库集成 | 丰富(OpenCV、Boost、Eigen 等) | 丰富(NumPy、SciPy、TensorFlow 等) | --- ## ✅ 三、如何选择? | 你的需求 | 推荐技术 | |---------|-----------| | 快速做一个小工具 or 学习 GUI 编程 | ✅ PyQt5 或 PySide6 | | 科学计算、数据分析可视化 | ✅ PySide6 + Matplotlib | | 工业控制、嵌入式、高性能应用 | ✅ C++ Qt | | 商业闭源软件发布 | ✅ C++ Qt 或 PySide6(LGPL) | | 团队协作、大型项目架构 | ✅ C++ Qt | | 跨平台桌面应用原型设计 | ✅ Python + PySide6 | --- ## ✅ 四、互操作性:能否混合使用? 可以部分结合: - 用 C++ Qt 写核心模块(高性能算法),编译为共享库(`.so` / `.dll`) - 用 Python 调用这些库(通过 `ctypes`、`cffi` 或 `pybind11`) - GUI 层用 PyQt5/PySide 构建 例如: ```python import ctypes lib = ctypes.CDLL("./my_cpp_module.so") lib.compute_something() ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值