在帧之间切换而不删除每帧的内容

时间:2018-02-10 18:16:21

标签: python user-interface pyqt qstackedwidget

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

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

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_())

1 个答案:

答案 0 :(得分:1)

而不是切换centralwidget,因为:

  

Note: QMainWindow获取小部件指针的所有权,并在适当的时候删除它。

你也不能使用实例,因为它们在首次使用后也会被删除,你应该使用QStackedWidget并将centralwidget设置一次。

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 )