From a7d7634f1bfd3311ea56120726496bb18856ed6c Mon Sep 17 00:00:00 2001 From: Axel Spoerl Date: Tue, 15 Aug 2023 12:49:58 +0200 Subject: Implement QSignalBlocker::dismiss() ...to set m_o to nullptr and prevent an existing QSignalBlocker from touching the QObject, which it was created for. Add documentation and implement an autotest. Change-Id: Ic18e80af5a57df1928f9d36aa0ab7ad79b6525fd Reviewed-by: Volker Hilsheimer --- src/corelib/kernel/qobject.cpp | 8 ++++++++ src/corelib/kernel/qobject.h | 6 ++++++ .../auto/corelib/kernel/qsignalblocker/tst_qsignalblocker.cpp | 11 +++++++++++ 3 files changed, 25 insertions(+) diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 7c109238b2..4b767b7b5b 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 7c3d74dcda..a7b2648e45 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 3345707a74..08d40ab8ba 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" -- cgit v1.2.3