最近在用pyqt做一个项目的集成平台,设计的首先是一个登陆界面,输入正确的账号密码之后,进入主功能去。这里就涉及到界面跳转的问题了。在网上包括CSDN、知乎找了很多资料,但是都说的不明不白,经过一番探索,我发现只要三行代码就能实现界面跳转,非常简单。

首先,我需要声明的是,我是代码风格按照我的“面向对象”的模板写的,我也建议大家用这个模板:

面向对象的GUI编程思想_PyQt5面向对象的版本基本结构_PyQt5学习笔记(六)

创建两个界面

为了方面理解,这里我创建两个非常简单的界面。

第一个是登录按钮,记作login.py,代码内容如下:

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("界面跳转的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        self.btn()

    def btn(self):
        btn1 = QPushButton(self)
        btn1.setText("登录按钮")
        btn1.move(200, 200)


# 方便在模板里进行调试
if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

代码

第二个是功能区界面,记作mainFunction.py,代码如下:

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *


class MainFunc(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("这是主界面哦")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        self.f1()

    def f1(self):
        l1 = QLabel(self)
        l1.setText("功能1")
        l1.move(100, 100)

        l2 = QLabel(self)
        l2.setText("功能2")
        l2.move(100, 180)

        l3 = QLabel(self)
        l3.setText("功能3")
        l3.move(100, 260)


# 方便在模板里进行调试
if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = MainFunction()
    window.show()
    sys.exit(app.exec_())

功能界面

三句代码实现界面跳转

  • 第一句代码

在登录界面引入功能界面的类。

这里我直接导入所有的,也就是import *

会发现from PyQt5.Qt import *变灰了,没错,就是失效了,因为mainFunction.py里面已经有了,所以可以去了。

当然,也可以只导入mainFunction.py里的类,那就写作from mainFunction import MainFunc

导入

  • 第二句代码

在登录界面对引入的类进行实体化。这里就是在main入口力写一个对象来继承这个类。

对引入的对象实体化

  • 第三句代码

在槽函数里面调用实体化的对象。

调用第二个窗口

这样改写后的login.py代码就是:

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
from mainFunction import MainFunc


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("界面跳转的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        self.btn()

    def btn(self):
        btn1 = QPushButton(self)
        btn1.setText("登录按钮")
        btn1.move(200, 200)

        def btnfun():
            self.close()
            mainFunc.show()

        btn1.clicked.connect(btnfun)


# 方便在模板里进行调试
if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = Window()
    mainFunc = MainFunc()
    window.show()
    sys.exit(app.exec_())

拓展:三个或更多界面跳转闪退怎么办?

上面的方法在两个界面文件进行跳转的时候还算好使,但是我做的这个项目远不止一个界面,发现按照上面的做法,在进入登录界面,跳转到功能界面的时候是好使的,但是再跳转到具体的功能的界面时,就是出现闪退的情况。这时因为没有进行绑定。

还是三步走,但是位置稍微变化了点。

第一步还是导入,这里不再赘述。

第二步和第三步则直接写在槽函数里,并且绑定当前窗口。

多界面进行跳转闪退的解决办法

这种写法,对两个窗口或者多个窗口都是适用的。

这是的login.py的代码就是:

# -*- coding: UTF-8 -*-
from PyQt5.Qt import *
from mainFunction import MainFunc


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("界面跳转的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        self.btn()

    def btn(self):
        btn1 = QPushButton(self)
        btn1.setText("登录按钮")
        btn1.move(200, 200)

        def btnfun():
            self.close()
            self.gongneng = MainFunc()
            self.gongneng.show()

        btn1.clicked.connect(btnfun)


# 方便在模板里进行调试
if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/pyqttiaozhuan.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 08 月 11 日
如果觉得我的文章对你有用,请随意赞赏