gpt4 book ai didi

python - 替换 MainWindow 中的 CentralWidget

转载 作者:太空狗 更新时间:2023-10-29 21:32:13 41 4
gpt4 key购买 nike

我是 PySide 的新手。我有一个主窗口对象,它一次显示一个小部件。我一直在尝试更改 QMainWindow 类的中央小部件,以便在按下按钮时替换窗口中的可见小部件。问题是按下的按钮在 Widget 类中,而不是在主窗口类中。

说...

class App(QtGui.QMainWindow):

def __init__(self):
super(App, self).__init__()

self.initUI()

def initUI(self):

self.statusBar().showMessage('Listo.') #Status Bar
self.login_screen = LoginScreen()
self.logged_in_screen = LoggedInScreen()

self.setCentralWidget(self.login_screen)

self.setGeometry(300, 300, 450, 600) #Window Size
self.setWindowTitle('PyTransactio - Client') #Window Title
self.setWindowIcon(QtGui.QIcon('icon.png')) #App Icon
self.show()

按下的按钮在 login_screen 实例中。单击按钮时调用的方法位于 LoginScreen 类中:

def login(self):
""" Send login data to the server in order to log in """

#Process

self.setParent(None)

将父小部件设置为 None 将从主窗口中删除小部件 (login_screen)。当 loginButton (在 login_screen小部件)被按下?

也许登录方法应该在主窗口类中?如果是这样,我如何将 login_screen 中按下的按钮与主窗口的方法连接起来?

最佳答案

您可以使用 QStackedWidget作为中央小部件,并向其添加登录屏幕和“已登录”屏幕。

用法示例:

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

如果您不想使用这个小部件,那么我认为您每次更改中央小部件时都必须调用 QMainWindow.setCentralWidget

至于login 方法应该放在哪里,这要看情况。也许你可以为你的主窗口定义一个简单的接口(interface)来添加/删除/显示特定的中央小部件,并从 LoginScreenlogin 方法调用它。通过这种方式,LoginScreen 类不必了解实现细节,例如中央小部件是否实际上是一个 QStackedWidget 或者这件事是否以其他方式完成。

关于python - 替换 MainWindow 中的 CentralWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13550076/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com