2011-11-24 101 views
2

我是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提前

+0

python中的代碼應該縮進4個空格,而不是製表符。參見[PEP8](http://www.python.org/dev/peps/pep-0008/)。請確保您在SO上張貼時尊重這一慣例! (這次固定爲你!) – mac

+0

謝謝,我會記住 – user3777

回答

2

嗯,你的代碼是不完整的,但我會建議你採取的hide()方法的優點。 你可以在你的按鈕函數中定義這個,這樣你不想出現的所有小部件都隱藏起來,並且在同一個函數上調用你想要在他們的位置出現的小部件。我用這樣做,因爲它使我的項目更有組織,易於跟蹤和調試。此外,這還允許您使用show()方法使該窗口小部件再次可見,如果需要的話。

+0

謝謝,我認爲這是適當的解決方案 – user3777

0

您可以使用「QtGui.QStackedWidget()」。將窗口拆分爲多個框架,將每個框架添加到QStackedWidget()並使用函數setCurrentWidget()來選擇要顯示的框架(在框架之間切換)。

self.central_widget.addWidget(self.mainFrame) 
self.central_widget.setCurrentWidget(self.mainFrame)