PyQt多窗口切换
-
理解QApplication
每一个Qt程序都需要有一个QApplication对象,调用*.exec_()方法进入该程序的主循环(即事件循环),事件处理从调用该方法后开始,主循环接受事件消息并将其分发给程序的各个控件,并且程序中不能同时有多个事件循环。 -
show()方法
使用show()方法将窗口控件显示在屏幕上。 -
实现多窗口(非对话框形式)
示例程序代码框架如下图所示:
loginView包中含有login界面的控件信息,以及login界面的控制器(即login界面中的业务逻辑),MainWin中包含的文件也是如此。
主程序main.py中主要负责显示窗口,以及绑定与切换窗口有关的信号/槽函数。from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * import sys from LoginView.login import loginControl from MainWin.mainWin import MainWinController class ViewController: def loadLoginView(self): self.viewlogin = loginControl() #需要将viewlogin设为成员变量 self.viewlogin.loginSignal.connect(self.loadMainWinView) self.viewlogin.show() def loadMainWinView(self, str): self.viewMainWIn = MainWinController() self.viewMainWIn.setWindowTitle("MainWin") self.viewMainWIn.exitSignal.connect(self.loadLoginView) #不需要回到登录界面可以省略 self.viewMainWIn.show() if __name__ == '__main__': app = QApplication(sys.argv) view = ViewController() view.loadLoginView() #进入登录界面,如果viewlogin不是成员变量,则离开作用域后失效。 sys.exit(app.exec_())
目前来说主程序很简单,但是可以体现出基本的框架。
self.viewlogin = loginControl()
创建一个loginControl()的成员变量,这里需要注意将其作为成员变量,否则在函数调用结束后,就会离开其作用域,该变量就会失效了,就可能会出现运行后一闪而过的现象。
self.viewlogin.loginSignal.connect(self.loadMainWinView)
将登录界面中的登录成功信号绑定到加载主窗口的槽函数
loadMianWinView
函数中,用户点击登录按钮后(或者有别的方式执行登录操作时)我们往往还需要进行一些判断的操作等等,当一切准备就绪后,我们就可以在登录窗口发出loginSignal信号,当然也可以在信号中传递一些数据。self.viewlogin.show()
接下来就是将这个界面显示出来。
两个窗口都在一个事件循环中
下面是login.py的代码:
from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * from LoginView.loginUI import * class loginControl(QWidget, Ui_Form): loginSignal = pyqtSignal(str) def __init__(self, parent= None): super(loginControl, self).__init__(parent) self.setupUi(self) self.pushButton_enter.clicked.connect(self.btnEnterClicked) self.pushButton_exit.clicked.connect(self.btnExitClicked) def btnEnterClicked(self): print("enter clicked") #中间可以添加处理逻辑 self.loginSignal.emit("login") self.close() def btnExitClicked(self): print("Exit clicked") self.close()
这只是demo有别的需要还可以往里面加东西。
下面是mainWin.py的代码:
from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * from MainWin.mainWinUI import * class MainWinController(QMainWindow, Ui_MainWindow): exitSignal = pyqtSignal()