我使用下面的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_())
答案 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 )