如何在小部件被销毁之前自动释放一些资源?

2024-10-03 09:10:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在销毁小部件之前释放一些资源,但我不想手动执行(我有许多小部件,每个小部件都有自己的资源)。我希望在关闭整个GUI软件时自动调用release函数,就像我可以使用c++在每个widget destruct函数中那样。我该怎么做?你知道吗

编辑:主要资源是QThread,它的事件循环在构建的小部件上启动。我想在小部件被销毁之前停止事件循环。你知道吗

编辑:正如@mguijarr所说,我将widget destructed signal连接到资源释放函数,但似乎不起作用:

from PySide import QtGui, QtCore
import sys

class MyWidget(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        print 'init MyWidget'
        super(MyWidget, self).__init__(*args, **kwargs)
        self.destroyed.connect(self.onDestroyed)

    def onDestroyed(self):
        print 'onDestroyed invoked'


if __name__ == '__main__':
    a = QtGui.QApplication(sys.argv)
    w = MyWidget()
    w.setWindowTitle('Test')
    w.show()
    a.exec_()
    print 'app exit!'

当我启动应用程序然后关闭它时,输出是:

init MyWidget

app exit!


Tags: 函数importself编辑init部件defsys
1条回答
网友
1楼 · 发布于 2024-10-03 09:10:10

您可以连接来自您的QObject基类的destroyed信号 小部件到您自己的类似析构函数的函数中,有一个技巧: 小部件需要设置“DeleteOnClose”属性:

from PyQt4 import QtGui, QtCore
import sys

class MyWidget(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        print 'init MyWidget'
        super(MyWidget, self).__init__(*args, **kwargs)
        ###
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
        self.destroyed.connect(self.onDestroyed)
        ###
    def onDestroyed(self):
        print 'onDestroyed invoked'

if __name__ == '__main__':
    a = QtGui.QApplication(sys.argv)
    w = MyWidget()
    w.setWindowTitle('Test')
    w.show()
    a.exec_()
    print 'app exit!

输出:

~% python /tmp/bla.py
init MyWidget
onDestroyed invoked
app exit!

相关问题 更多 >