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

时间:2015-07-27 08:11:25

标签: python pyside

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

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

编辑:正如@mguijarr所说,我将widget销毁的信号连接到资源释放功能,但它似乎不起作用:

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退出!

1 个答案:

答案 0 :(得分:0)

您可以连接来自destroyed基类的QObject信号 对于你自己的类似析构函数的小部件,有一个技巧: 小部件需要设置'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!