#python #qt #qt4 #pyqt4
#python #qt #qt4 #pyqt4
Вопрос:
Все в заголовке вопроса и моем упрощенном коде ниже. Согласно документам: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qdialog.html#done при нажатии Ok он должен закрыться, и действительно, если я закрою его с помощью кнопки закрытия окна, он запускает событие:
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_()
Ответ №1:
Ответ пришел от http://www.riverbankcomputing.com/pipermail/pyqt/2011-April/029589.html с большой благодарностью Хансу-Питеру Янсену
-
Не подключайте обработчик для уничтоженного сигнала к уничтожаемому объекту.(оглядываясь назад, кажется очевидным)
-
QDialog.accept() не запускает closeEvent, даже если он уничтожается — ошибка или документация вводят в заблуждение, ИМХО
Ответ №2:
Это совсем не то, что говорится в документах:
Как и в случае с QWidget.close(), done() удаляет диалоговое окно, если установлен флаг Qt.WA_DeleteOnClose.
Это никогда не вызовет событие закрытия (оно не должно — вы приняли, а не закрыли; это две разные вещи), и вы закомментировали ту часть, которая приводит к удалению диалогового окна.
Комментарии:
1. из документов: «Закрывает диалоговое окно и присваивает его результирующему коду значение r», я бы ожидал, что это означает, что оно должно вызвать closeEvent. И даже с удаленным комментарием setAttribute ничего другого не происходит. Вызов destroy() (после комментария del my_widget) приводит к: RuntimeError: базовый объект C / C был удален