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

【PyQt5】一个小软件的制作01 | Qt Designer设计界面
本软件界面功能的实现主要是基于pycharm完成的,其中包括页面的跳转、各按钮功能实现、获得页面填写内容、显示图片、查找信息、删除信息等等。这一篇主要讲的是页面跳转,其余功能会在后续文章中记录。
【PyQt5|【PyQt5】一个小软件的制作过程02 | 页面跳转】
主界面跳转至子界面 以下记录主界面跳转至多个子界面的设计过程。
在最初生成各界面的py文件时,点击运行并没有弹出窗口,根据网上教的方法注释了如图中所示的3行代码。
PyQt5|【PyQt5】一个小软件的制作过程02 | 页面跳转
文章图片

注释掉这三行代码之后,点击运行,成功显示了主界面!(如果你需要实现页面跳转,请往后看!!!)
在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|【PyQt5】一个小软件的制作过程02 | 页面跳转
文章图片

运行上面的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_Uiclass 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|【PyQt5】一个小软件的制作过程02 | 页面跳转
文章图片
PyQt5|【PyQt5】一个小软件的制作过程02 | 页面跳转
文章图片

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

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

    推荐阅读