diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 7c109238b20..4b767b7b5b7 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -762,6 +762,14 @@ QMetaCallEvent* QMetaCallEvent::create_impl(QtPrivate::SlotObjUniquePtr slotObj, every unblock() undoes any number of reblock() calls. */ +/*! + \fn void QSignalBlocker::dismiss() + \since 6.7 + Dismisses the QSignalBlocker. It will no longer access the QObject + passed to its constructor. unblock(), reblock(), as well as + ~QSignalBlocker() will have no effect. +*/ + /*! \class QObject \inmodule QtCore diff --git a/src/corelib/kernel/qobject.h b/src/corelib/kernel/qobject.h index 7c3d74dcdad..a7b2648e451 100644 --- a/src/corelib/kernel/qobject.h +++ b/src/corelib/kernel/qobject.h @@ -454,6 +454,7 @@ public: inline void reblock() noexcept; inline void unblock() noexcept; + inline void dismiss() noexcept; private: Q_DISABLE_COPY(QSignalBlocker) @@ -518,6 +519,11 @@ void QSignalBlocker::unblock() noexcept m_inhibited = true; } +void QSignalBlocker::dismiss() noexcept +{ + m_o = nullptr; +} + namespace QtPrivate { inline QObject & deref_for_methodcall(QObject &o) { return o; } inline QObject & deref_for_methodcall(QObject *o) { return *o; } diff --git a/tests/auto/corelib/kernel/qsignalblocker/tst_qsignalblocker.cpp b/tests/auto/corelib/kernel/qsignalblocker/tst_qsignalblocker.cpp index 3345707a741..08d40ab8bae 100644 --- a/tests/auto/corelib/kernel/qsignalblocker/tst_qsignalblocker.cpp +++ b/tests/auto/corelib/kernel/qsignalblocker/tst_qsignalblocker.cpp @@ -11,6 +11,7 @@ class tst_QSignalBlocker : public QObject private slots: void signalBlocking(); void moveAssignment(); + void dismiss(); }; void tst_QSignalBlocker::signalBlocking() @@ -133,5 +134,15 @@ void tst_QSignalBlocker::moveAssignment() QVERIFY(!o2.signalsBlocked()); } +void tst_QSignalBlocker::dismiss() +{ + QObject obj; + { + QSignalBlocker blocker(obj); + blocker.dismiss(); + } + QVERIFY(obj.signalsBlocked()); +} + QTEST_MAIN(tst_QSignalBlocker) #include "tst_qsignalblocker.moc"