文探索了动态加载UI方式,重写关闭窗体事件,希望对初学者有用。
前言
动态加载UI后,怎样重写关闭窗体事件?笔者一年前,多次询问过、查询过这个问题,网上的主要的解决方法:
- 重写QuiLoader()方法:用这个重写的QuiLoader()方法加载UI,之后的重写Even常规进行。
- 先写一个QWindow类,其中重写Even;然后实例化这个类,将UI动态加载到其中。
进来,通过摸索,发现并没有这么复杂,具体见下文:
一、关于动态加载UI
动态加载UI,即:使用QUiLoader().load()方法加载UI。
我们动态加载ui文件时,使用了QUiLoader().load()方法,这个方法不能够接收主窗体的Close()事件,因此我们重写的Close()事件不生效。
下面分为UI为QWedget、QWindow两种情况,动态加载UI后,重写的Close()事件。
二、动态加载UI后,重写的Close()事件
1.UI为QWedget
理论不多讲,直接上代码,需要注意的地方已经标注(亲测有效):
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication,QMainWindow, QWidget
class Window(QWidget): # 注意此处
def __init__(self):
super().__init__()
self.ui = QUiLoader().load('main2.ui',self) # 注意此处
def closeEvent(self, event): # 仅为测试用,具体事件自写
print('hi')
if __name__ == '__main__':
app = QApplication([])
main = Window()
main.show() # 注意此处,不是ui.show()
app.exec_()
2.UI为QWindow
简单明了,直接上代码,需要注意的地方已经标注(亲测有效):
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication,QMainWindow
class Window(QMainWindow): # 注意此处
def __init__(self, parent=None): # 注意此处
super(Window, self).__init__(parent) # 注意此处
self.ui = QUiLoader().load('main1.ui',parent)
self.setCentralWidget(self.ui) # 注意此处:将self.ui加载到 QMainWindow 的CentralWidget
self.resize(800, 500)
def closeEvent(self, event): #仅为测试用,具体事件自写
print('hi')
if __name__ == '__main__':
app = QApplication([])
main = Window()
main.show() # 注意此处,不是ui.show()
app.exec_()
总结
动态加载UI界面的方式可以随时更新调测UI,更加方便快捷,尤其受初学者的喜爱。但是,QuiLoader是使用组合的方法将控件塞入内部命名空间,并没有真正创建一个顶级类,因此无法响应事件。本文探索了动态加载UI方式,重写关闭窗体事件,希望对初学者有用。