diff options
-rw-r--r-- | src/widgets/dialogs/qdialog.cpp | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 31 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget_p.h | 16 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 4 |
4 files changed, 31 insertions, 22 deletions
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp index c416ba9a5c..9e18e2443a 100644 --- a/src/widgets/dialogs/qdialog.cpp +++ b/src/widgets/dialogs/qdialog.cpp @@ -155,7 +155,7 @@ void QDialogPrivate::hide(int resultCode) q->setResult(resultCode); q->hide(); - close_helper(QWidgetPrivate::CloseNoEvent); + handleClose(QWidgetPrivate::CloseNoEvent); resetModalitySetByOpen(); } diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 90f89b99fe..069e77c1cb 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -1005,7 +1005,7 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f) data.window_modality = Qt::NonModal; data.sizehint_forced = 0; - data.is_closing = 0; + data.is_closing = false; data.in_show = 0; data.in_set_window_state = 0; data.in_destructor = false; @@ -1466,7 +1466,7 @@ QWidget::~QWidget() if (isWindow() && isVisible() && internalWinId()) { QT_TRY { - d->close_helper(QWidgetPrivate::CloseNoEvent); + d->handleClose(QWidgetPrivate::CloseNoEvent); } QT_CATCH(...) { // if we're out of memory, at least hide the window. QT_TRY { @@ -8385,13 +8385,12 @@ void QWidgetPrivate::hideChildren(bool spontaneous) The function is also called by the QWidget destructor, with \a mode set to CloseNoEvent. */ -bool QWidgetPrivate::close_helper(CloseMode mode) +bool QWidgetPrivate::handleClose(CloseMode mode) { - if (data.is_closing) - return true; - Q_Q(QWidget); - data.is_closing = 1; + + // We might not have initiated the close, so update the state now that we know + data.is_closing = true; QPointer<QWidget> that = q; QPointer<QWidget> parentWidget = (q->parentWidget() && !QObjectPrivate::get(q->parentWidget())->wasDeleted) ? q->parentWidget() : nullptr; @@ -8404,7 +8403,7 @@ bool QWidgetPrivate::close_helper(CloseMode mode) else QCoreApplication::sendEvent(q, &e); if (!that.isNull() && !e.isAccepted()) { - data.is_closing = 0; + data.is_closing = false; return false; } } @@ -8438,7 +8437,7 @@ bool QWidgetPrivate::close_helper(CloseMode mode) if (!that.isNull()) { - data.is_closing = 0; + data.is_closing = false; if (q->testAttribute(Qt::WA_DeleteOnClose)) { q->setAttribute(Qt::WA_DeleteOnClose, false); q->deleteLater(); @@ -8472,13 +8471,23 @@ bool QWidgetPrivate::close_helper(CloseMode mode) bool QWidget::close() { + return d_func()->close(); +} + +bool QWidgetPrivate::close() +{ + if (data.is_closing) + return true; + + data.is_closing = true; + // Close native widgets via QWindow::close() in order to run QWindow - // close code. The QWidget-specific close code in close_helper() will + // close code. The QWidget-specific close code in handleClose() will // in this case be called from the Close event handler in QWidgetWindow. if (QWindow *widgetWindow = windowHandle()) return widgetWindow->close(); - return d_func()->close_helper(QWidgetPrivate::CloseWithEvent); + return handleClose(QWidgetPrivate::CloseWithEvent); } /*! diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index a8a3ad1447..db458be7f1 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -236,13 +236,6 @@ public: Q_DECLARE_FLAGS(DrawWidgetFlags, DrawWidgetFlag) Q_FLAG(DrawWidgetFlags) - enum CloseMode { - CloseNoEvent, - CloseWithEvent, - CloseWithSpontaneousEvent - }; - Q_ENUM(CloseMode) - enum Direction { DirectionNorth = 0x01, DirectionEast = 0x10, @@ -374,7 +367,14 @@ public: const QRegion &getOpaqueChildren() const; void setDirtyOpaqueRegion(); - bool close_helper(CloseMode mode); + bool close(); + enum CloseMode { + CloseNoEvent, + CloseWithEvent, + CloseWithSpontaneousEvent + }; + Q_ENUM(CloseMode) + bool handleClose(CloseMode mode); void setWindowIcon_helper(); void setWindowIcon_sys(); diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 029d152f5d..5ca26a39cb 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -841,9 +841,9 @@ void QWidgetWindow::handleResizeEvent(QResizeEvent *event) void QWidgetWindow::handleCloseEvent(QCloseEvent *event) { Q_D(QWidgetWindow); - bool is_closing = m_widget->d_func()->close_helper(d->inClose ? QWidgetPrivate::CloseWithEvent + bool accepted = m_widget->d_func()->handleClose(d->inClose ? QWidgetPrivate::CloseWithEvent : QWidgetPrivate::CloseWithSpontaneousEvent); - event->setAccepted(is_closing); + event->setAccepted(accepted); } #if QT_CONFIG(wheelevent) |