在不擦除每帧内容的情况下在帧之间切换

Switching between frames without erasing contents of each frame

我一直在使用下面的 setCentralWidget 方法(此处已简化)编写 GUI 以在帧之间转换 - 但直到很远才意识到它在移动时擦除每个 window到下一个(我需要避免)。我的实际代码有输入框,需要将其保持在完成状态,以便用户返回该框架进行修改等。

我想尽可能少地更改我的层次结构来重写 - 最有可能使用 QStackedWidget 或类似的东西。我在网上找到的唯一例子不是在我的程序需要的 class 层次结构中编写的(每个页面在它自己的 class 中)。有人在下面的示例文本中看到了简单/优雅的解决方案吗?

import sys
from PyQt4.QtGui import QApplication, QMainWindow, QPushButton, QWidget

class UIWindow(QWidget):
    def __init__(self, parent=None):
        super(UIWindow, self).__init__(parent)
        self.ToolsBTN = QPushButton('go P1', self)
        self.ToolsBTN.move(50, 350)

class UIToolTab(QWidget):
    def __init__(self, parent=None):
        super(UIToolTab, self).__init__(parent)
        self.CPSBTN = QPushButton("go P2", self)
        self.CPSBTN.move(100, 350)

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setGeometry(50, 50, 400, 450)
        self.setFixedSize(400, 450)
        self.gotoP2()

    def gotoP2(self):
        self.ToolTab = UIToolTab(self)
        self.setWindowTitle("Page1")
        self.setCentralWidget(self.ToolTab)
        self.ToolTab.CPSBTN.clicked.connect(self.gotoP1)
        self.show()

    def gotoP1(self):
        self.Window = UIWindow(self)
        self.setWindowTitle("Page2")
        self.setCentralWidget(self.Window)
        self.Window.ToolsBTN.clicked.connect(self.gotoP2)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

而不是切换 centralwidget,因为:

Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time.

您也不能使用实例,因为它们在第一次使用后也会被删除,您应该使用 QStackedWidget 并只设置一次中央控件。

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setGeometry(50, 50, 400, 450)

        ToolTab = UIToolTab( self )
        ToolTab.CPSBTN.clicked.connect( self.gotoP1 )
        Window = UIWindow( self )
        Window.ToolsBTN.clicked.connect( self.gotoP2 )
        self.stack = QStackedWidget(self)
        self.stack.addWidget(ToolTab)
        self.stack.addWidget( Window )
        self.setCentralWidget( self.stack )
        self.show()

    def gotoP2(self):
        self.setWindowTitle("Page1")
        self.stack.setCurrentIndex(0)

    def gotoP1(self):
        self.setWindowTitle("Page2")
        self.stack.setCurrentIndex( 1 )