Python PyQT4-替换主窗口上的小部件

Python PyQT4-替换主窗口上的小部件,python,pyqt,qmainwindow,Python,Pyqt,Qmainwindow,我是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 ev

我是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_())
正确呈现第一个小部件

sanu主窗口。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
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_指令与SAN_简介几乎相同,但设置中的命令不同:

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_指令动态生成)小部件? 我尝试更新/显示/重新绘制mainwindow/centralwidget/parent。 但我在单击按钮时只得到self.RemoveActiveWidget()

也许我的观念是错误的


Thanx预先

嗯,您的代码不完整,但我建议您利用hide()方法。 您可以在按钮函数中定义它,以便隐藏所有不希望显示的小部件,并在同一函数中调用希望显示在其位置上的小部件。我使用这种方式是因为它使我的项目更有条理,更易于跟踪和调试。此外,如果需要,还可以使用show()方法使小部件再次可见。

您可以使用“QtGui.QStackedWidget()”。将窗口拆分为多个帧,将每个帧添加到QStackedWidget()中,并使用函数setCurrentWidget()选择要显示的帧(在帧之间切换)


python中的代码应该缩进4个空格,而不是制表符。看见请确保您在发布时遵守此约定!(这次为你修正了!)谢谢,我认为这是合适的解决方案
self.central_widget.addWidget(self.mainFrame)
self.central_widget.setCurrentWidget(self.mainFrame)