PyQt5窗口设计基础之界面逻辑代码分离

一、单界面代码与逻辑代码分离

若在QtDesigner中更新界面,在转成.py文件会导致之前编辑的逻辑代码失效,所以需要逻辑代码与界面代码分离。

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

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


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(290, 117)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(100, 20, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 290, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        # MainWindow.setStatusBar(self.statusbar)
        # MainWindow.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "关闭"))


import sys
# 主方法,程序从此处启动PyQt设计的窗口
if __name__ == '__main__':
   app = QtWidgets.QApplication(sys.argv)
   app.setStyle("Fusion") # 设置窗口风格
   MainWindow = QtWidgets.QMainWindow() # 创建窗体对象
   ui = Ui_MainWindow() # 创建PyQt设计的窗体对象
   ui.setupUi(MainWindow) # 调用PyQt窗体的方法对窗体对象进行初始化设置
   MainWindow.show() # 显示窗体
   sys.exit(app.exec_()) # 程序关闭时退出进程

以上为未界面与逻辑分离的主窗口运行程序ui_Demo.py,现在新建一个分离后的主窗口运行程序Demo.py

from PyQt5 import QtWidgets, QtGui, QtCore
from ui_Demo import Ui_MainWindow


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.showMessage)
        self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)

    def showMessage(self):
        from PyQt5.QtWidgets import QMessageBox  # 导入QMessageBox类
        # 使用information()方法弹出信息提示
        QMessageBox.information(mainWindow, "提示框", "欢迎进入PyQt5编程世界", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)


if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("Fusion")  # 设置窗口风格
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

原理就是将ui_Demo.py导入,之后在Demo.py中继承,在继承后的类中添加逻辑代码,在逻辑代码中实现了以下两个功能

  • 自定义顶层窗口外观及说明

在ui_Demo中被注释掉的
MainWindow.setStatusBar(self.statusbar)
MainWindow.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)
在Demo中表示为
self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)

  • 弹出对话框

添加弹出对话框函数

    def showMessage(self):
        from PyQt5.QtWidgets import QMessageBox  # 导入QMessageBox类
        # 使用information()方法弹出信息提示
        QMessageBox.information(mainWindow, "提示框", "欢迎进入PyQt5编程世界", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)

在初始化函数中调用
self.pushButton.clicked.connect(self.showMessage)

二、多窗口关联时界面与逻辑代码分离

现在需求,在一个主窗口中,单击button,同时打开其他窗口
现在有first.py为主窗口界面,second.py与third.py为后续打开窗口代码

若未分离,需要在.ui文件转成的代码中,将
class Ui_MainWindow(object):
中Ui_MainWIndow类继承的根类变为继承PyQt5.QWidgets.QmainWindow类
form PyQt5.QWidgets import QMainWindow
class Ui_MainWindow(QMainWindow):

若要界面与逻辑代码分离,思路为在代码部分,新建secondWindow类与thirdWindow类,分别继承second.py模块与third.py模块中自动生成的Ui_MainWindow类

class secondWindow(QtWidgets.QMainWindow, second.Ui_MainWindow):

    def __init__(self, parent=None):
        super(secondWindow, self).__init__(parent)
        self.setupUi(self)


class thirdWindow(QtWidgets.QMainWindow, third.Ui_MainWindow):

    def __init__(self, parent=None):
        super(thirdWindow, self).__init__(parent)
        self.setupUi(self)

在这段之间可以使用逻辑代码修改弹出窗口的样式
之后再在主窗口运行程序中新建open槽函数并调用

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.open)

    def open(self):
        self.second = secondWindow()
        self.second.show()
        self.third = thirdWindow()
        self.third.show()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容