Python 为什么在接受PyQt4 QDialog时不会调用closeEvent和destroyed slot?

Python 为什么在接受PyQt4 QDialog时不会调用closeEvent和destroyed slot?,python,qt,qt4,pyqt4,Python,Qt,Qt4,Pyqt4,所有的问题都在标题中,下面是我的简化代码。 根据文件: 单击“确定”时,它应该关闭,如果我使用“窗口关闭”按钮关闭它,它将触发事件: from PyQt4.QtGui import * from PyQt4.QtCore import * class MyDialog(QDialog): def __init__(self): QDialog.__init__(self) self.button_box = QDialogButtonBox(se

所有的问题都在标题中,下面是我的简化代码。 根据文件: 单击“确定”时,它应该关闭,如果我使用“窗口关闭”按钮关闭它,它将触发事件:

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyDialog(QDialog):    
    def __init__(self):
        QDialog.__init__(self)
        self.button_box = QDialogButtonBox(self)
        self.button_box.addButton(self.button_box.Ok)
        self.connect(self.button_box, SIGNAL('accepted()'), self.on_accept)
        layout = QVBoxLayout()
        layout.addWidget(self.button_box)
        #self.setAttribute(Qt.WA_DeleteOnClose)
        self.setLayout(layout)
        self.connect(self.button_box, SIGNAL('destroyed(QObject*)'), self.on_destroyed)

    def on_destroyed(self, *args):
        print("destroying dialog")

    def on_accept(self):
        print("accepting")
        self.done(1)

    def closeEvent(self, event):
        print("close")
        return QDialog.closeEvent(self, event)

#    def __del__(self):
#        QDialog.destroy(self)

my_app = QApplication([])
my_widget = MyDialog()
result = my_widget.exec_()
del my_widget
#my_widget.destroy()
if result == 1:
    print("result!")
else:
    print("other result:", result)
my_app.exec_()

这些文件根本不是这么说的:

与QWidget.close()一样,如果设置了Qt.WA_DeleteOnClose标志,则done()将删除对话框


它永远不会触发关闭事件(不应该-你接受而不是关闭;这是两件不同的事情),并且你已经注释掉了使它删除对话框的部分。

这根本不是文档所说的:

与QWidget.close()一样,如果设置了Qt.WA_DeleteOnClose标志,则done()将删除对话框

它永远不会触发关闭事件(不应该-你接受而不是关闭;这是两件不同的事情),并且你已经注释掉了使它删除对话框的部分。

答案来自 非常感谢汉斯·彼得·詹森

  • 不要将已销毁信号的处理程序挂接到正在销毁的对象上。(回想起来似乎很明显)

  • accept()不会激发closeEvent,即使它确实被销毁了-错误或文档误导了IMHO

  • 答案来自 非常感谢汉斯·彼得·詹森

  • 不要将已销毁信号的处理程序挂接到正在销毁的对象上。(回想起来似乎很明显)

  • accept()不会激发closeEvent,即使它确实被销毁了-错误或文档误导了IMHO

  • 在文档中:“关闭对话框并将其结果代码设置为r”,我希望这意味着它应该引发closeEvent。即使删除了setAttribute注释,也不会发生任何变化。调用destroy()。即使删除了setAttribute注释,也不会发生任何变化。调用destroy()