2011-11-24 88 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) 
相关问题