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 <volker.hilsheimer@qt.io>
This commit is contained in:
Axel Spoerl 2023-08-15 12:49:58 +02:00
parent 38380de63c
commit a7d7634f1b
3 changed files with 25 additions and 0 deletions

View File

@ -762,6 +762,14 @@ QMetaCallEvent* QMetaCallEvent::create_impl(QtPrivate::SlotObjUniquePtr slotObj,
every unblock() undoes any number of reblock() calls. 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 \class QObject
\inmodule QtCore \inmodule QtCore

View File

@ -454,6 +454,7 @@ public:
inline void reblock() noexcept; inline void reblock() noexcept;
inline void unblock() noexcept; inline void unblock() noexcept;
inline void dismiss() noexcept;
private: private:
Q_DISABLE_COPY(QSignalBlocker) Q_DISABLE_COPY(QSignalBlocker)
@ -518,6 +519,11 @@ void QSignalBlocker::unblock() noexcept
m_inhibited = true; m_inhibited = true;
} }
void QSignalBlocker::dismiss() noexcept
{
m_o = nullptr;
}
namespace QtPrivate { namespace QtPrivate {
inline QObject & deref_for_methodcall(QObject &o) { return o; } inline QObject & deref_for_methodcall(QObject &o) { return o; }
inline QObject & deref_for_methodcall(QObject *o) { return *o; } inline QObject & deref_for_methodcall(QObject *o) { return *o; }

View File

@ -11,6 +11,7 @@ class tst_QSignalBlocker : public QObject
private slots: private slots:
void signalBlocking(); void signalBlocking();
void moveAssignment(); void moveAssignment();
void dismiss();
}; };
void tst_QSignalBlocker::signalBlocking() void tst_QSignalBlocker::signalBlocking()
@ -133,5 +134,15 @@ void tst_QSignalBlocker::moveAssignment()
QVERIFY(!o2.signalsBlocked()); QVERIFY(!o2.signalsBlocked());
} }
void tst_QSignalBlocker::dismiss()
{
QObject obj;
{
QSignalBlocker blocker(obj);
blocker.dismiss();
}
QVERIFY(obj.signalsBlocked());
}
QTEST_MAIN(tst_QSignalBlocker) QTEST_MAIN(tst_QSignalBlocker)
#include "tst_qsignalblocker.moc" #include "tst_qsignalblocker.moc"