Какой хороший вопрос. (Я никогда об этом не думал.)
После того, как это вызвало у меня любопытство, я немного исследовал. Это хорошее в программном обеспечении OpenSource - если вы сомневаетесь, просто посмотрите исходный код. Итак, я немного покопался в woboq.org :
Сначала я искал closeEvent()
в qmainwindow. cpp, но я нигде не нашел.
То же самое в qmainwindow.h .
Итак, я предполагаю QMainWindow
не отменяет closeEvent()
.
QMainWindow
является производным от QWidget
, что легко можно найти в do c. или прямо в исходном коде, который у меня уже есть:
class Q_WIDGETS_EXPORT QMainWindow : public QWidget
Таким образом, я переключился на qwidget.h , который объявляет
virtual void closeEvent(QCloseEvent *event);
(в настоящее время в строке 634 ).
Еще один щелчок, и я подошел в qwidget. cpp: 9936 :
void QWidget::closeEvent(QCloseEvent *event)
{
event->accept();
}
Ах, да, да.
Это прекрасно объясняет, почему вызов метода базового класса
QMainWindow::closeEvent(event);
работает так же, как простой вызов на
event->accept();
или даже на оба.
Тем не менее, я бы предпочел вызов обработчика событий базового класса.
Я считаю это общим полезным правилом -thumb (или идиома?):
Если поведение базового класса должно быть расширенным , тогда вызовите обработчик событий базового класса в вашем переопределенном.
Если поведение базового класса должно быть заменено , тогда не вызывайте обработчик событий базового класса.
Конечно, это это общее практическое правило, и его следует e перепроверяется в зависимости от указанного c события, которое должно быть обработано.
(И в случае сомнений, все еще существует woboq.org . ..)