這是此問題的後續問題。 Connecting Pyside with matplotlib使用QtDesigner將Pyside與Matplotlib連接 - 使用pushButton繪製
我的PythonFu無法讓我做一件簡單的事情:使用QtDesigner設計一個GUI,將其轉換爲QPushButton並繪製一些東西。它在QtDesigner未被使用時起作用,但隨着應用程序變得越來越複雜,需要QtDesigner,因此必須使用QtDesigner。下面是代碼:
** ** main.py
import sys
import platform
import numpy as np
import PySide
from PySide import QtCore
from PySide.QtGui import QApplication, QMainWindow, QTextEdit,\
QPushButton, QMessageBox, QWidget, QVBoxLayout
__version__ = '0.0.1'
from mpl import Ui_MainWindow
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.main_frame = Ui_MainWindow()
self.main_frame.setupUi(self)
#self.button = QPushButton('Run')
def plot_stuff(self):
x = np.arange(1024)
self.main_frame.widget.axes.plot(np.exp(-x/256) * np.cos(2 * np.pi * x/32), 'g')
self.main_frame.widget.canvas.draw()
if __name__ == '__main__':
app = QApplication(sys.argv)
frame = MainWindow()
frame.main_frame.pushButton.clicked.connect(frame.plot_stuff)
frame.show()
app.exec_()
** ** matplotlibwidget.py
import matplotlib
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
class MatplotlibWidget(FigureCanvas):
def __init__(self, parent=None):
super(MatplotlibWidget, self).__init__(Figure())
self.setParent(parent)
self.figure = Figure()
self.canvas = FigureCanvas(self.figure)
self.axes = self.figure.add_subplot(111)
和** ** mpl.py,從MPL轉換。 ui
from PySide import QtCore, QtGui
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(640, 480)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(20, 410, 74, 20))
self.pushButton.setObjectName("pushButton")
self.widget = MatplotlibWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(100, 40, 471, 321))
self.widget.setObjectName("widget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 17))
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))
self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Run", None, QtGui.QApplication.UnicodeUTF8))
from widgets.matplotlibwidget import MatplotlibWidget
按鈕連接起作用,但圖表從不顯示。
謝謝!
您是否將此行從'widgets.matplotlibwidget import MatplotlibWidget'添加到mpl.py? – Jeff 2012-03-01 02:34:49
看起來像是將該行添加到轉換後的.ui文件。你不應該那樣做。你想要做的就是在QtDesigner中通過右鍵單擊並選擇「Promote to ...」,然後選擇你想要提升的那個模塊來推廣這個小部件。這應該有助於http://developer.qt.nokia.com/doc/qt-4.8/designer-using-custom-widgets.html – Jeff 2012-03-01 03:13:30
@Jeff,當我在Designer中推廣Widget時,Designer就是自動包含該行的人員之一, 如你所說。當我宣傳包含該行的Widget時。有什麼想法嗎? – Ivan 2012-03-05 14:26:09