系列文章目录
前言
项目中用到了QMdiArea,QMdiSubWindow作为子页面容器。但是有一些按键事件非常耗时,需要新增一个功能:页面使用线程方式运行耗时部分代码,但是在运行线程时,在用户点击关闭子页面或者主页面时需要提示用户有多线程(多进程)在运行,否则则会在线程未完成之前就可能被用户关闭页面了。
一、子页面新增关闭询问函数
新增toClose函数页面关闭时调用函数使用:
def toClose(self) -> bool:
if self.isBackRun:
msg = TlsQMessage(******)# 自定义的msg类,询问是否关闭子页面
msg.exec_()
if msg.isOk(): # 逻辑处理:如果用户点击ok按钮表示关闭
return False
else:
return True
else:
return True
初始化页面时设置isBackRun为False;在运行多线程之前设置isBackRun为True;运行完成之后设置为False。
二、子页面关闭事件
class MQMdiSubWindow(QMdiSubWindow):
def __init__(self,widgetName, parent=None):
super(MQMdiSubWindow, self).__init__(parent)
self.parentObj=parent
self.widgetName = widgetName
def closeEvent(self, closeEvent: QtGui.QCloseEvent) -> None:
wdt = self.widget()
if hasattr(wdt,'toClose') :
if not wdt.toClose(): # 如果没有点击ok按钮不关闭页面
closeEvent.ignore() # 事件取消(忽略)
return
三、 主页面关闭事件
在主页面关闭事件中,需要遍历子页面,调用子页面状态(isBackRun)进行判断即可。
for sub in self.mdi.subWindowList():
wdt = sub.widget()
if hasattr(wdt,'isBackRun') and wdt.isBackRun:
ret = False
break
如果需要写的更精细一点的方式,就是要用加锁方式处理,避免资源冲突。