【PyQt5】一个小软件的制作过程02 | 页面跳转

【PyQt5】一个小软件的制作01 | Qt Designer设计界面

       本软件界面功能的实现主要是基于pycharm完成的,其中包括页面的跳转、各按钮功能实现、获得页面填写内容、显示图片、查找信息、删除信息等等。这一篇主要讲的是页面跳转,其余功能会在后续文章中记录。

主界面跳转至子界面

       以下记录主界面跳转至多个子界面的设计过程。

       在最初生成各界面的py文件时,点击运行并没有弹出窗口,根据网上教的方法注释了如图中所示的3行代码。

【PyQt5】一个小软件的制作过程02 | 页面跳转_第1张图片

       注释掉这三行代码之后,点击运行,成功显示了主界面!(如果你需要实现页面跳转,请往后看!!!)

       在pycharm中微调好个界面的布局之后,开始着手实现页面的跳转功能,本文采用的是在网上学习的:利用2个控制器Controller()实现页面跳转,通过点击相应按钮跳转到次级界面。

       已有界面:主界面,信息录入界面,信息查询界面,快速诊断界面;

       对应已有的代码文件:start.py,writein.py,find.py,diagnose.py

       要实现多界面跳转,需要新建一个py文件,我新建的文件命名为mainrun.py,代码及注释如下:

import sys
from PyQt5 import QtWidgets, QtCore

# 导入 Qt designer 设计的页面
from start import Ui_MainWindow as Start_Ui  # 从start.py中导入其内容
from writein import Ui_MessageInput as Writein_Ui
from find import Ui_MessageSearch as Find_Ui
from diagnose import Ui_Diagnose as Diagnose_Ui


# 主窗口
class MainWindow(QtWidgets.QMainWindow, Start_Ui):
    switch_window1 = QtCore.pyqtSignal()  # 跳转信号
    switch_window2 = QtCore.pyqtSignal()  # 跳转信号
    switch_window3 = QtCore.pyqtSignal()  # 跳转信号

    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.inputbutton.clicked.connect(self.goWritein)  # 界面中三个按钮连接到三个子界面
        self.findbutton.clicked.connect(self.goFind)
        self.diagnosebutton.clicked.connect(self.goDiagnose)

    def goWritein(self):
        self.switch_window1.emit()

    def goFind(self):
        self.switch_window2.emit()

    def goDiagnose(self):
        self.switch_window3.emit()


# 录入窗口
class WriteinWindow(QtWidgets.QDialog, Writein_Ui):
    switch_window5 = QtCore.pyqtSignal()  # 返回主界面的跳转信号

    def __init__(self):
        super(WriteinWindow, self).__init__()
        self.setupUi(self)
        self.return_main.clicked.connect(self.goWritein_start)

    def goWritein_start(self):  # 从录入界面返回至主界面
        self.switch_window5.emit()


# 查找窗口
class FindWindow(QtWidgets.QMainWindow, Find_Ui):
    switch_window6 = QtCore.pyqtSignal()  # 返回主界面的跳转信号

    def __init__(self):
        super(FindWindow, self).__init__()
        self.setupUi(self)
        self.return_button.clicked.connect(self.goFind_start)

    def goFind_start(self):  # 从查找界面返回至主界面
        self.switch_window6.emit()


# 诊断窗口
class DiagnoseWindow(QtWidgets.QMainWindow, Diagnose_Ui):
    switch_window7 = QtCore.pyqtSignal()  # 返回主界面的跳转信号

    def __init__(self):
        super(DiagnoseWindow, self).__init__()
        self.setupUi(self)
        self.returnbutton.clicked.connect(self.goDiagnose_start)

    def goDiagnose_start(self):  # 从诊断界面返回至主界面
        self.switch_window7.emit()


# 控制器1,实现主界面跳转至子界面
class Controller1:
    def __init__(self):
        self.writein = WriteinWindow()
        self.start = MainWindow()
        self.find = FindWindow()
        self.diagnose = DiagnoseWindow()

    # 显示主界面
    def show_start(self):
        self.start.switch_window1.connect(self.show_writein)
        self.start.switch_window2.connect(self.show_find)
        self.start.switch_window3.connect(self.show_diagnose)
        self.start.show()

    # 跳转到录入窗口, 关闭主界面
    def show_writein(self):
        self.start.close()
        self.writein.show()

    # 跳转到查找窗口, 关闭主界面
    def show_find(self):
        self.start.close()
        self.find.show()

    # 跳转到诊断窗口, 关闭主界面
    def show_diagnose(self):
        self.start.close()
        self.diagnose.show()


# 控制器2,实现子界面返回主界面
class Controller2:
    def __init__(self, go):
        self.writein = go.writein
        self.start = go.start
        self.find = go.find
        self.diagnose = go.diagnose

    #录入窗口返回主窗口
    def show_writein_start(self):
        self.writein.switch_window5.connect(self.show_start_)
        self.writein.hide()

    #查找窗口返回主窗口
    def show_find_start(self):
        self.find.switch_window6.connect(self.show_start_)
        self.find.hide()

    #诊断窗口返回主窗口
    def show_diagnose_start(self):
        self.diagnose.switch_window7.connect(self.show_start_)
        self.diagnose.hide()

    # 显示主窗口
    def show_start_(self):
        self.writein.close()
        self.find.close()
        self.diagnose.close()
        self.start.show()

def main():
    app = QtWidgets.QApplication(sys.argv)
    controller1 = Controller1()  # 实例控制器
    controller2 = Controller2(controller1)
    controller1.show_start()  # 默认展示的是主页面
    controller2.show_writein_start()
    controller2.show_find_start()
    controller2.show_diagnose_start()
    sys.exit(app.exec_())
    input("please input any key to exit!")


if __name__ == '__main__':
    main()

       以上代码是通过上网搜索了多种方法,对比之后觉得相对更好的方法,进行了稍微的整理和修改,按道理应该是可以使用的。可是一直无法成功实现页面跳转,花费了很多时间查找原因。

       最后!!!发现是因为此前注释的3行代码使得一直默认显示主界面,阻碍了页面跳转功能的实现。取消注释那三行代码,运行mainrun.py就可以了!!!(希望遇到同样问题的小伙伴看到!!不要像我一样在这个坑里刨那么久!)

【PyQt5】一个小软件的制作过程02 | 页面跳转_第2张图片

        运行上面的mainrun.py,可以实现点击前三个按钮,跳转至三个不同的界面(因为最后没有设计其他功能,所以“敬请期待”按钮没有设置跳转功能)。

二级界面跳转至三级界面

       本来以为页面跳转功能我已经学得炉火纯青了,没想到后面又遇到二级界面和三级界面的跳转问题。在实现此功能之前,我一直误以为main函数只能写于运行的文件中(即本设计的mainrun.py),于是在仿照主界面跳转至子界面来实现二、三级界面的跳转时,无从下手。

       后来发现是自己想复杂了,从二级界面跳转至三级界面,只需要写入一个main函数实现跳转就行。二级界面中相应代码及注释如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'find.ui'
#
# Created by: PyQt5 UI code generator 5.12.3
#
# WARNING! All changes made in this file will be lost!

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QAbstractItemView, QApplication
from PyQt5.QtGui import QBrush, QColor
from detail import Ui_detail as detail_Ui


class Ui_MessageSearch(object):

    def setupUi(self, find):
        # 此处省略了一些界面UI代码

        # 双击表格中任意行打开详细信息界面
        self.tableWidget.doubleClicked.connect(self.Detailwindow)
        self.show()


class DetailWindow(QtWidgets.QDialog, detail_Ui):  # 详细信息界面

    def __init__(self):
        super(DetailWindow, self).__init__()
        self.setupUi(self)

    def goDetail_start(self):
        self.switch_window8.emit() 


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 创建主窗口
    window = Ui_MessageSearch()
    # 显示窗口
    window.show()
    # 运行应用,并监听事件
    sys.exit(app.exec_())


       从主界面点击“信息查询”按钮,跳转至信息查询界面,双击表格中任意一行,打开相应的详细信息界面。 

【PyQt5】一个小软件的制作过程02 | 页面跳转_第3张图片【PyQt5】一个小软件的制作过程02 | 页面跳转_第4张图片

PS:该软件模拟医疗场景下的信息读取存储,以上数据均为虚构。

       至此,实现了多界面跳转,其中包括主界面向多个子界面跳转、子界面返回主界面、二级界面跳转至三级界面。

你可能感兴趣的:(PyQt5,qt,pycharm,python)