diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2021-09-07 11:41:26 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2021-09-07 21:09:49 +0200 |
commit | 121fddcf5ae2ab238ef802e44b45ce62c56015f5 (patch) | |
tree | 43b9c9508bbceba0067505f300bb81bdf1979bc6 /src/widgets/kernel/qwidget.cpp | |
parent | 80256b3683ca95907e71a7c127c74b865b1f0fe7 (diff) |
Split up close handling in QWidget into a pre and post step
If we are the one initiating the close (from Qt Widget land), we want
to mark the widget as closing as early as possible.
Clarified the role of close_helper by renaming it to handleClose.
Change-Id: Iae250a0ae1583d743c59e99fcb99fdf18d2a1882
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/widgets/kernel/qwidget.cpp')
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
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); } /*! |