<p>您可以使用<a href="http://doc.qt.io/archives/qt-4.8/qstackedwidget.html" rel="nofollow noreferrer">^{<cd1>}</a>作为中心小部件,并将登录屏幕和“登录”屏幕都添加到其中。</p>
<p>示例用法:</p>
<pre><code>from PyQt4 import QtCore, QtGui
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.central_widget = QtGui.QStackedWidget()
self.setCentralWidget(self.central_widget)
login_widget = LoginWidget(self)
login_widget.button.clicked.connect(self.login)
self.central_widget.addWidget(login_widget)
def login(self):
logged_in_widget = LoggedWidget(self)
self.central_widget.addWidget(logged_in_widget)
self.central_widget.setCurrentWidget(logged_in_widget)
class LoginWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(LoginWidget, self).__init__(parent)
layout = QtGui.QHBoxLayout()
self.button = QtGui.QPushButton('Login')
layout.addWidget(self.button)
self.setLayout(layout)
# you might want to do self.button.click.connect(self.parent().login) here
class LoggedWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(LoggedWidget, self).__init__(parent)
layout = QtGui.QHBoxLayout()
self.label = QtGui.QLabel('logged in!')
layout.addWidget(self.label)
self.setLayout(layout)
if __name__ == '__main__':
app = QtGui.QApplication([])
window = MainWindow()
window.show()
app.exec_()
</code></pre>
<p>如果您不想使用这个小部件,那么我认为您每次更改中心小部件时都必须调用<code>QMainWindow.setCentralWidget</code>。</p>
<p>至于<code>login</code>方法应该在哪里,这取决于。可能您可以为主窗口定义一个简单的接口来添加/删除/显示特定的中心小部件,并从<code>LoginScreen</code>的<code>login</code>方法调用它。这样,<code>LoginScreen</code>类就不必知道实现的细节,比如中心小部件实际上是一个<code>QStackedWidget</code>还是以另一种方式完成的。</p>