将matplotlib图形嵌入到QtDesigner GUI中

5

我正在努力通过在Qt Designer中创建的Qt GUI中嵌入matplotlib图形来完成任务。 我已经能够仅通过Python创建所需的图形。我创建了一个基本GUI,其中包含小部件,使我能够选择/加载输入文件,并将这些文件中的数据绘制在嵌入在GUI中的matplotlib图形中。我通过向GUI添加名为plotwidget的空白小部件,然后使用此小部件调用GraphInit类来实现这一点。

我目前面临的问题是,在GUI中显示的图形虽然按预期显示和更新,但似乎没有关注Python代码(创建FigureCanvas的地方)或Qt Designer中plotWidget小部件定义的大小策略。我已经使用此演示文稿等作为项目起点。 但是,所有这些示例都是完全由Python生成GUI。我怀疑我在将matplotlib图形分配给小部件时做错了什么,但是我还没有能够找出具体问题。

代码(导入和绘图代码已删除,但核心部分包括添加图形的代码):

import sys
import os
import matplotlib
matplotlib.use('Qt5Agg')
from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QApplication, QMessageBox, QFileDialog, QPushButton, QLabel, QRadioButton, QDoubleSpinBox, QSpinBox, QWidget, QSizePolicy, QMainWindow
import PyQt5.uic

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

import json
from datetime import datetime
import numpy as np


class LogViewer(QApplication):
    def __init__(self):
        QApplication.__init__(self, sys.argv)
        self.ui = UI()

    @staticmethod
    def main():
        vwr = LogViewer()
        vwr.run()

    def run(self):
        self.ui.win.show()  # Show the UI
        self.ui.run()  # Execute the UI run script
        self.exec_()


class Graph_init(FigureCanvas):

    def __init__(self, parent=None):

        fig = Figure()
        self.axes = fig.add_subplot(111)
        self.compute_initial_figure()
        self.axes.grid()

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self):
        pass

class UI(object):
    def __init__(self):
        ui_path = os.path.dirname(os.path.realpath(__file__))
        self.win = PyQt5.uic.loadUi(ui_path + '\\logview.ui')
        self.filename = ui_path + '\\test.txt'
        self.plotWin = Graph_init(self.win.plotWidget)

    def run(self):
        self.init_ui()  # get initial values from the controllers
        self.attach_ui_connections()

    def init_ui(self):
        w = self.win
        w.txtLogFilename.setText(self.filename.split('/')[-1])  # just the file (no path)

    def attach_ui_connections(self):
        w = self.win



if __name__ == '__main__':
    LogViewer.main()

GUI可以在这里下载。欢迎提出任何建议!


“.ui”文件的链接已经失效。请在您对被接受的答案进行更正后,发布更新后的文件。谢谢。我正在尝试使用这篇文章来学习如何做到这一点。 - Echeban
GUI链接已经失效了。您能否重新发布一下?我遇到了类似的问题,想看看.ui文件,以便找出需要做什么。 - Brad
1个回答

4
我查看了你的UI文件,发现plotWidget没有任何布局。尝试给它添加一个布局,我建议使用网格布局。
之后,在父级画布中添加以下代码:
self.setParent(parent)

尝试将它添加到父布局中:

parent.layout().addWidget(self)

太棒了!非常感谢您的帮助。我已经意识到之前需要给小部件设置布局,但是我错过了将画布添加到该布局的关键步骤。 - Julian Leland Bell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接