所有问题标题和下面的简化代码。 根据文件: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qdialog.html#done 单击确定时,它应该关闭,如果我使用窗口关闭按钮关闭它,它会触发事件:
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_()
答案 0 :(得分:2)
答案来自http://www.riverbankcomputing.com/pipermail/pyqt/2011-April/029589.html 非常感谢Hans-Peter Jansen
不要将被破坏信号的处理程序挂钩到被破坏的对象上。(回想起来似乎很明显)
QDialog.accept()不会触发closeEvent,即使它被破坏 - bug或文档会误导恕我直言
答案 1 :(得分:1)
这不是文档所说的:
与QWidget.close()一样,如果设置了Qt.WA_DeleteOnClose标志,done()将删除该对话框。
它永远不会触发一个关闭事件(它不应该 - 你接受而不是关闭;这是两件不同的事情),你已经注释掉了使它删除对话框的部分。