我有点新PySide.I有一个主窗口对象,显示在同一时间一个小部件。 我一直试图改变的中央物件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
从主窗口)。 我应该为了得到另一个部件(例如做logged_in_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
方法应该是,它依赖。 也许你可以定义一个简单的界面,为您的主窗口中添加/删除/显示特定的中央部件,并从调用它login
方法LoginScreen
。 通过这种方式, LoginScreen
类不知道执行的细节,例如,如果中央窗口部件实际上是QStackedWidget
或这件事情是在其他的方式来完成。
您可以使用QMainWindow.setCentralWidget做到这一点(多次):
#! /usr/bin/env python3
from PySide import QtGui
from PySide import QtCore
import sys
app = QtGui.QApplication(sys.argv)
mw = QtGui.QMainWindow()
w2 = QtGui.QWidget()
pb = QtGui.QPushButton('push me', w2)
l1 = QtGui.QLabel('orig')
l2 = QtGui.QLabel('changed')
mw.setCentralWidget(l1)
pb.clicked.connect(lambda: mw.setCentralWidget(l2))
mw.show()
w2.show()
sys.exit(app.exec_())