在不擦除每帧内容的情况下在帧之间切换
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 )
我一直在使用下面的 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 )