почему closeEvent и разрушенный слот не вызываются при принятии PyQt4 QDialog? - PullRequest
0 голосов
/ 06 апреля 2011

Все в названии вопроса, и мой упрощенный код ниже. Согласно документам: 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_()

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Ответ пришел от http://www.riverbankcomputing.com/pipermail/pyqt/2011-April/029589.html с огромной благодарностью Ганса-Питера Янсена

  1. Не подключайте обработчик для уничтоженного сигнала к разрушаемому объекту (кажется очевиднымв ретроспективе)

  2. QDialog.accept () не запускает closeEvent, даже если он уничтожается - ошибка или документация вводят в заблуждение IMHO

1 голос
/ 06 апреля 2011

Это совсем не то, что говорят доктора:

Как и в случае с QWidget.close (), done () удаляет диалоговое окно, если установлен флаг Qt.WA_DeleteOnClose.

Он никогда не будет вызывать событие закрытия (это не предполагается - вы приняли, а не закрыли; это две разные вещи), и вы прокомментировали ту часть, которая заставляет его удалить диалог.

...