我一直在寻找一个有效的示例,该示例如何在使用QT设计器创建的pyside中嵌入matplotlib图,同时将逻辑保存在单独的文件中。我知道网络上有很多示例,但是没有一个示例实际使用QT设计器,而是创建了一个单独的文件来添加将matplitlib图添加到小部件的逻辑。我找到了一个示例,“几乎”可以使用http://blog.rcnelson.com/building-a-matplotlib-gui-with-qt-designer-part-1/,但是在我的版本中,不可能“将layoutName属性从“verticalLayout”更改为“mplvl””。

因此,我有以下具体问题:
我不清楚在Pyside Qt设计器中该图可以嵌入到哪个项目中。这是一个简单的“小部件”吗(因为pyside中没有matplotlib小部件可用)。如果是这样,我如何将图添加到该小部件中?还是我必须使用Qt Designer创建一个'FigureCanvas'?这有可能吗?如果是这样,怎么办?

这是我可以用Pyside Qt设计器在嵌入小部件时做出的最简单的设计(对吗?)。现在如何在其之上添加matplotlib图?

如答案之一所示,我现在将Qwidget升级为MyStaticMplCanvas,并将Qwidget的名称编辑为mplvl。

使用Pyside Qt设计器自动生成的文件,并使用编译
pyside-uic ui.ui -o ui.py -x

ui.py看起来像这样:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'gui.ui'
#
# Created: Wed Apr 20 14:00:02 2016
#      by: pyside-uic 0.2.15 running on PySide 1.2.2
#
# WARNING! All changes made in this file will be lost!

from PySide import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(444, 530)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.mplvl = MyStaticMplCanvas(self.centralwidget)
        self.mplvl.setGeometry(QtCore.QRect(120, 190, 221, 161))
        self.mplvl.setObjectName("mplvl")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 444, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))

from mystaticmplcanvas import MyStaticMplCanvas

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

现在如何从一个单独的.py文件将图添加到mplvl对象中?

最佳答案

我不是这方面的专家,因此这可能不是最干净的方法,但是下面的一些工作代码可以帮助您入门:

  • 我认为添加小部件的最简单方法是通过QxxxxLayout
  • 然后我只是让您的Plotter继承自FigureCanvas
  • ,并告诉matplotlibPySide一起使用

  • ui.py:
    from PySide import QtCore, QtGui
    
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.setObjectName("Form")
            Form.resize(533, 497)
            self.mplvl = QtGui.QWidget(Form)
            self.mplvl.setGeometry(QtCore.QRect(150, 150, 251, 231))
            self.mplvl.setObjectName("mplvl")
            self.vLayout = QtGui.QVBoxLayout()
            self.mplvl.setLayout(self.vLayout)
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
    
        def retranslateUi(self, Form):
            Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
    

    为此,您只需将 Canvas 添加到mplvl中的QtDesigner

    main.py:
    import matplotlib
    matplotlib.use('Qt4Agg')
    matplotlib.rcParams['backend.qt4'] = 'PySide'
    from matplotlib.backends.backend_qt4agg import (
        FigureCanvasQTAgg as FigureCanvas,
        NavigationToolbar2QT as NavigationToolbar)
    from matplotlib.figure import Figure
    from PySide import QtGui, QtCore
    import random
    
    from weakref import proxy
    from ui import Ui_Form
    
    
    class Plotter(FigureCanvas):
        def __init__(self, parent):
            ''' plot some random stuff '''
            self.parent = proxy(parent)
            # random data
            data = [random.random() for i in range(10)]
            fig = Figure()
            super(Plotter,self).__init__(fig)
            # create an axis
            self.axes = fig.add_subplot(111)
            # discards the old graph
            self.axes.hold(False)
            # plot data
            self.axes.plot(data, '*-')
    
        def binding_plotter_with_ui(self):
            self.parent.vLayout.insertWidget(1, self)
    
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        Form = QtGui.QWidget()
        ui = Ui_Form()
        ui.setupUi(Form)
        # plotter logic and binding needs to be added here
        plotter = Plotter(ui)
        plotter.binding_plotter_with_ui()
        plotter2 = Plotter(ui)
        plotter2.binding_plotter_with_ui()
        Form.show()
        sys.exit(app.exec_())
    

    现在剩下的可能是调整FigureCanvas使其具有正确的大小和比例,因此您应该能够查看this examplethe other获得所需的内容。

    祝你好运!

    关于python - Pyside中的Matplotlib与Qt设计器(PySide),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36464357/

    10-12 21:04