Widget's “destroyed” signal is not fired (PyQT)

前端 未结 2 725
Happy的楠姐
Happy的楠姐 2021-01-17 23:26

I have a widget which would have to do some manual cleanup after it\'s destroyed (stop some threads). However for some reason the \"destroyed\" signal of the widget is not f

2条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-01-18 00:15

    After a few tries I found out that it works if you declare the doSomeDestruction outside the class. (see at the bottom)
    But I don't know why. As written in this answer, this is because At the point destroyed() is emitted, the widget isn't a QWidget anymore, just a QObject (as destroyed() is emitted from ~QObject).
    This means when your function would be called it is already deleted if you write it in the class. (look also here in the qt-interest mailing list: Ok , I am sorry for stupid question. The signal is emitted, but the slot is not called for the obvious reason, that is because object is already deleted. )

    EDIT: I've found two ways make it really work:

    1. add a simple del window after ret = app.exec_().
    2. Set the WA_DeleteOnClose attribute in the main window (not the widget):
      At the top of the program:

      from PyQt4 import QtCore
      

      The changed __init__ function:

      class MyWindow(QtGui.QMainWindow):
          def __init__(self):
              super(MyWindow, self).__init__()
              self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
              self.widget = MyWidget(self)
      

提交回复
热议问题