PyQt:由 Qt Designer 创建的开关 windows/layouts

PyQt: switch windows/layouts created by Qt Designer

我正在使用 PyQt4 创建一个应用程序。我用 Qt Designer 创建了两个界面。当按下按钮时,我想在一种布局和另一种布局之间切换。

我的代码示例是:

from PyQt4 import QtGui, uic
form_class = uic.loadUiType("sample.ui")[0]
form_class2 = uic.loadUiType("sample2.ui")[0]

class SecondLayout(form_class2, QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        form_class2.setupUi(self)

class MainWindow(form_class, QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.btn.clicked.connect(self.open_new_window)
    def open_new_window(self):
        self.Window = SecondLayout()
        # here I would like to switch the layout with a layout of self.Window

app = QtGui.QApplication(sys.argv)
myWindow = MainWindow(None) 
myWindow.show()
app.exec_()

我已经搜索和阅读了很多有关 QStackedLayout 的内容,但无法让它与在 Qt Designer 中创建的布局一起使用。

我的问题是我如何才能拥有一个 Main Window 并切换其中央小部件,但我不确定这是否适用于单独的菜单。我已经在 Qt Designer 中将所有菜单、小部件和状态栏等定义为两个不同的项目(都是主要 windows),所以我想将主程序放在主要 windows 之一中,然后在某个时候创建​​第二个主要 window 的实例并切换布局和所有小部件、菜单、文本编辑等。我尝试使用 setCentralWidget 但没有为我工作。

有人可以向我解释一下如何做到这一点。

听起来你有两个完全独立的主windows。切换所有小部件、菜单、工具栏等真的没有意义,因为它们没有共享代码。您也可以简单地隐藏一个 window,然后显示另一个

这是一个简单的演示,展示了一种方法:

PyQt5

from PyQt5 import QtWidgets

class Window1(QtWidgets.QMainWindow):
    def __init__(self, window2=None):
        super(Window1, self).__init__()
        self.setGeometry(500, 100, 100, 50)
        self.button = QtWidgets.QPushButton('Go To Window 2', self)
        self.button.clicked.connect(self.handleButton)
        self.setCentralWidget(self.button)
        self._window2 = window2

    def handleButton(self):
        self.hide()
        if self._window2 is None:
            self._window2 = Window2(self)
        self._window2.show()

class Window2(QtWidgets.QMainWindow):
    def __init__(self, window1=None):
        super(Window2, self).__init__()
        self.setGeometry(500, 100, 100, 50)
        self.button = QtWidgets.QPushButton('Go To Window 1', self)
        self.button.clicked.connect(self.handleButton)
        self.setCentralWidget(self.button)
        self._window1 = window1

    def handleButton(self):
        self.hide()
        if self._window1 is None:
            self._window1 = Window1(self)
        self._window1.show()

if __name__ == '__main__':

    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Window1()
    window.show()
    sys.exit(app.exec_())

PyQt4

from PyQt4 import QtCore, QtGui

class Window1(QtGui.QMainWindow):
    def __init__(self, window2=None):
        super(Window1, self).__init__()
        self.setGeometry(500, 100, 100, 50)
        self.button = QtGui.QPushButton('Go To Window 2', self)
        self.button.clicked.connect(self.handleButton)
        self.setCentralWidget(self.button)
        self._window2 = window2

    def handleButton(self):
        self.hide()
        if self._window2 is None:
            self._window2 = Window2(self)
        self._window2.show()

class Window2(QtGui.QMainWindow):
    def __init__(self, window1=None):
        super(Window2, self).__init__()
        self.setGeometry(500, 100, 100, 50)
        self.button = QtGui.QPushButton('Go To Window 1', self)
        self.button.clicked.connect(self.handleButton)
        self.setCentralWidget(self.button)
        self._window1 = window1

    def handleButton(self):
        self.hide()
        if self._window1 is None:
            self._window1 = Window1(self)
        self._window1.show()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window1()
    window.show()
    sys.exit(app.exec_())