diff options
author | Liang Qi <liang.qi@qt.io> | 2018-01-20 22:34:43 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2018-01-20 22:36:19 +0100 |
commit | 65a97fccc67ae7f3df1900e1419955f939a49b9f (patch) | |
tree | a8fd0e119b585123e77e3b2574f2d82a5474eb28 /src/corelib/kernel/qcoreapplication.cpp | |
parent | 5e8bc07cb2ded1f5f74435411de666f419869514 (diff) | |
parent | 1303327a713d8f88fd9782e4f887b646d4210f68 (diff) |
Merge remote-tracking branch 'origin/5.10' into dev
Conflicts:
tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
Change-Id: If089d5010d15c33b3c1f13912d4386207456c1a9
Diffstat (limited to 'src/corelib/kernel/qcoreapplication.cpp')
-rw-r--r-- | src/corelib/kernel/qcoreapplication.cpp | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 7c39910212..e93a14c116 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -1480,6 +1480,9 @@ void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority) return; } + if (event->type() == QEvent::DeferredDelete) + receiver->d_ptr->deleteLaterCalled = true; + if (event->type() == QEvent::DeferredDelete && data == QThreadData::current()) { // remember the current running eventloop for DeferredDelete // events posted in the receiver's thread. @@ -1539,22 +1542,34 @@ bool QCoreApplication::compressEvent(QEvent *event, QObject *receiver, QPostEven return true; } } - } else -#endif - if ((event->type() == QEvent::DeferredDelete - || event->type() == QEvent::Quit) - && receiver->d_func()->postedEvents > 0) { - for (int i = 0; i < postedEvents->size(); ++i) { - const QPostEvent &cur = postedEvents->at(i); - if (cur.receiver != receiver + return false; + } +#endif + + if (event->type() == QEvent::DeferredDelete) { + if (receiver->d_ptr->deleteLaterCalled) { + // there was a previous DeferredDelete event, so we can drop the new one + delete event; + return true; + } + // deleteLaterCalled is set to true in postedEvents when queueing the very first + // deferred deletion event. + return false; + } + + if (event->type() == QEvent::Quit && receiver->d_func()->postedEvents > 0) { + for (int i = 0; i < postedEvents->size(); ++i) { + const QPostEvent &cur = postedEvents->at(i); + if (cur.receiver != receiver || cur.event == 0 || cur.event->type() != event->type()) - continue; - // found an event for this receiver - delete event; - return true; - } + continue; + // found an event for this receiver + delete event; + return true; } + } + return false; } @@ -2901,6 +2916,10 @@ void QCoreApplication::setEventDispatcher(QAbstractEventDispatcher *eventDispatc If QCoreApplication is deleted and another QCoreApplication is created, the startup function will be invoked again. + + \note This macro is not suitable for use in library code that is then + statically linked into an application since the function may not be called + at all due to being eliminated by the linker. */ /*! |