Bootstrap

pyqt5多窗口切换

最近在研究qt5,研究到多窗口切换,发现网上讲的不是很清楚,在此记录一下

第一页

首先创建页面
first = pyqtSignal()为一个连接槽,用于连接QPushButton的事件
self.first.emit()发出一个信号

class FirstUI(QWidget):
    first = pyqtSignal()

    def __init__(self, *args, **kwargs):
        super(FirstUI, self).__init__(*args, **kwargs)
        self.resize(500, 500)
        self.but = QPushButton('first', self)
        self.but.resize(100, 40)
        self.but.move(100, 100)
        self.but.clicked.connect(self.but_clicked)

    def but_clicked(self):
        self.first.emit()
        self.close()

emit()默认为空,如果添加值,例:emit('first ')时pyqtSignal()必须要一个参数接收数据pyqtSignal(str)str为数据类型,可自己替换
需要注意的是emit('first ')pyqtSignal(str)数据类型要统一

可以这么写:

class FirstUI(QWidget):
    first = pyqtSignal(str)

    def __init__(self, *args, **kwargs):
        super(FirstUI, self).__init__(*args, **kwargs)
        self.resize(500, 500)
        self.but = QPushButton('first', self)
        self.but.resize(100, 40)
        self.but.move(100, 100)
        self.but.clicked.connect(self.but_clicked)

    def but_clicked(self):
        self.first.emit('first')
        self.close()

第二页

代码与第一页基本相同

第一种写法

class SecondUi(QWidget):
    second = pyqtSignal()

    def __init__(self, *args, **kwargs):
        super(SecondUi, self).__init__(*args, **kwargs)
        self.resize(500, 500)
        self.but = QPushButton('second', self)
        self.but.resize(100, 40)
        self.but.move(100, 100)
        self.but.clicked.connect(self.but_clicked)

    def but_clicked(self):
        self.second.emit()
        self.close()

第二种写法

class SecondUi(QWidget):
    second = pyqtSignal(str)

    def __init__(self, *args, **kwargs):
        super(SecondUi, self).__init__(*args, **kwargs)
        self.resize(500, 500)
        self.but = QPushButton('second', self)
        self.but.resize(100, 40)
        self.but.move(100, 100)
        self.but.clicked.connect(self.but_clicked)

    def but_clicked(self):
        self.second.emit('second')
        self.close()

调用页面

self.firstui.first.connect(self.second)重写FirstUI()中的QPushButton事件
同理SecondUi()也是

注:重写后,程序会先运行
def but_clicked(self): self.second.emit('second') self.close()函数,运行完毕后会继续续运行自定义的函数

class MainWindow:
    def first(self):
        self.firstui = FirstUI()
        self.firstui.first.connect(self.second)
        self.firstui.show()

    def second(self):
        self.secondui = SecondUi()
        self.secondui.second.connect(self.first)
        self.secondui.show()

如果需要接收self.second.emit('second')中的’second’值,在调用槽函数时,在self.firstui.first.connect(self.second)中 可用self.second接收

请添加图片描述

完整代码

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys


class FirstUI(QWidget):
    first = pyqtSignal(str)

    def __init__(self, *args, **kwargs):
        super(FirstUI, self).__init__(*args, **kwargs)
        self.resize(500, 500)
        self.but = QPushButton('first', self)
        self.but.resize(100, 40)
        self.but.move(100, 100)
        self.but.clicked.connect(self.but_clicked)

    def but_clicked(self):
        self.first.emit('first')
        self.close()


class SecondUi(QWidget):
    second = pyqtSignal(str)

    def __init__(self, *args, **kwargs):
        super(SecondUi, self).__init__(*args, **kwargs)
        self.resize(500, 500)
        self.but = QPushButton('second', self)
        self.but.resize(100, 40)
        self.but.move(100, 100)
        self.but.clicked.connect(self.but_clicked)

    def but_clicked(self):
        self.second.emit('second')
        self.close()


class MainWindow:
    def first(self):
        self.firstui = FirstUI()
        self.firstui.first.connect(self.second)
        self.firstui.show()

    def second(self, st):
        print(st)
        self.secondui = SecondUi()
        self.secondui.second.connect(self.first)
        self.secondui.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ma = MainWindow()
    ma.first()
    sys.exit(app.exec_())  # app.exet_()是指程序一直循环运行直到主窗口被关闭终止进程(如果没有这句话,程序运行时会一闪而过)

若不需要第三个调用函数MainWindow(),也可以这么写

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys


class FirstUI(QWidget):
    def __init__(self, *args, **kwargs):
        super(FirstUI, self).__init__(*args, **kwargs)
        self.resize(500, 500)
        self.but = QPushButton('first', self)
        self.but.resize(100, 40)
        self.but.move(100, 100)
        self.but.clicked.connect(self.but_clicked)

    def but_clicked(self):
        self.close()
        # SecondUi必须为类的一个属性,否则程序会一闪而过,必须带self.
        self.s = SecondUi()
        self.s.show()


class SecondUi(QWidget):
    def __init__(self, *args, **kwargs):
        super(SecondUi, self).__init__(*args, **kwargs)
        self.resize(500, 500)
        self.but = QPushButton('second', self)
        self.but.resize(100, 40)
        self.but.move(100, 100)
        self.but.clicked.connect(self.but_clicked)

    def but_clicked(self):
        self.close()
        # FirstUI必须为类的一个属性,否则程序会一闪而过,必须带self.
        self.f = FirstUI()
        self.f.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    f = FirstUI()
    f.show()
    sys.exit(app.exec_())

;