一、单界面代码与逻辑代码分离
若在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()