PyQt多窗口切换

PyQt多窗口切换

  1. 理解QApplication
    每一个Qt程序都需要有一个QApplication对象,调用*.exec_()方法进入该程序的主循环(即事件循环),事件处理从调用该方法后开始,主循环接受事件消息并将其分发给程序的各个控件,并且程序中不能同时有多个事件循环。

  2. show()方法
    使用show()方法将窗口控件显示在屏幕上。

  3. 实现多窗口(非对话框形式)
    示例程序代码框架如下图所示:
    mutiWIn
    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()
    
        
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值