我是PyQT4中的新手,我遇到了下面的問題。PyQT4 - 在主窗口上替換窗口小部件
某些應用程序必須在一個屏幕上收集用戶數據 並顯示下一個按鈕點擊屏幕。
main.py
app = QtGui.QApplication(sys.argv)
#here I create main window with inherited class
w = SAN_MainWindow()
#and apply some basic geometry
w.SetUI()
#here first screen rendered and button event applyed
w.ApplyWidget(SAN_Intro())
w.show()
sys.exit(app.exec_())
第一小部件的渲染正確發生。
SAN_MainWindow.py:
class SAN_MainWindow(QtGui.QMainWindow):
def __init__(self):
super(SAN_MainWindow, self).__init__()
def SetUI(self):
self.setObjectName(_fromUtf8("MainWindow"))
self.resize(789, 602)
self.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.central_widget = QtGui.QWidget(self)
self.central_widget.setObjectName(_fromUtf8("central_widget"))
self.setCentralWidget(self.central_widget)
def ApplyWidget(self, widget):
self.active_widget = widget
self.active_widget.Setup(self.central_widget)
self.active_widget.SetControls(self)
def RemoveActiveWidget(self):
self.active_widget.widget().setParent(None)
def ShowInstruction(self):
self.RemoveActiveWidget()
self.ApplyWidget(SAN_Instruction())
#self.centralWidget().update() <- Problem
SAN_Intro.py:
class SAN_Intro(object):
def __init__(self):
super(SAN_Intro, self).__init__()
def Setup(self, widget):
self.gridLayoutWidget = QtGui.QWidget(widget)
self.gridLayoutWidget.setGeometry(QtCore.QRect(80, 30, 638, 451))
self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget"))
self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(-1, 16, 16, -1)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
#a lot of form inputs instructions....
def SetControls(self, main_window):
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), main_window.ShowInstruction)
def widget(self):
return self.gridLayoutWidget
SAN_Instruction是幾乎相同SAN_Intro,但在設置不同的命令:
class SAN_Instruction(object):
def __init__(self):
super(SAN_Instruction, self).__init__()
def Setup(self, widget):
self.verticalLayoutWidget = QtGui.QWidget(widget)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(40, 20, 591, 521))
self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget"))
self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setMargin(0)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
#a lot of form inputs instructions....
def SetControls(self, main_window):
pass
def widget(self):
return self.verticalLayoutWidget
這裏是問題: 如何顯示第二個(使用SAN_Instruction生成)小部件? 我試圖更新/顯示/重新繪製mainwindow/centralwidget/parent。 但我得到的所有按鈕單擊是self.RemoveActiveWidget()。
也許我的觀念不正確?
Thanx提前
python中的代碼應該縮進4個空格,而不是製表符。參見[PEP8](http://www.python.org/dev/peps/pep-0008/)。請確保您在SO上張貼時尊重這一慣例! (這次固定爲你!) – mac
謝謝,我會記住 – user3777