QSignalBlocker Class
围绕 `QObject::blockSignals()` 构建的异常安全封装类。更多内容...
| 头文件: | #include <QSignalBlocker> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
注意:该类中的所有函数均为可重入函数。
公共函数
| QSignalBlocker(QObject *object) | |
| QSignalBlocker(QObject &object) | |
| QSignalBlocker(QSignalBlocker &&other) | |
| ~QSignalBlocker() | |
(since 6.7) void | dismiss() |
| void | reblock() |
| void | unblock() |
| QSignalBlocker & | operator=(QSignalBlocker &&other) |
详细说明
在任何原本需要调用两次QObject::blockSignals() 的场合,均可使用 QSignalBlocker。它会在构造函数中阻塞信号,并在析构函数中将状态重置为构造函数执行前的状态。
{
const QSignalBlocker blocker(someQObject);
// no signals here
}因此,等同于
const bool wasBlocked = someQObject->blockSignals(true);
// no signals here
someQObject->blockSignals(wasBlocked);,不同之处在于使用 QSignalBlocker 的代码在遇到异常时是安全的。
另请参阅 QMutexLocker 和QEventLoopLocker 。
成员函数文档
[explicit noexcept] QSignalBlocker::QSignalBlocker(QObject *object)
构造函数。调用object->blockSignals(true)。
[explicit noexcept] QSignalBlocker::QSignalBlocker(QObject &object)
调用object.blockSignals(true)。
这是一个重载函数。
[noexcept] QSignalBlocker::QSignalBlocker(QSignalBlocker &&other)
从other 构建一个信号阻断器。other 将具有一个无操作的析构函数,而恢复QObject::signalsBlocked()状态的责任则转移到了新对象身上。
[noexcept] QSignalBlocker::~QSignalBlocker()
析构函数。将QObject::signalsBlocked()的状态恢复到构造函数执行之前的状态,除非unblock()被调用后未紧接着调用reblock(),在这种情况下,它不执行任何操作。
[noexcept, since 6.7] void QSignalBlocker::dismiss()
释放QSignalBlocker 。它将不再访问传递给其构造函数的QObject 。unblock()、reblock() 以及 ~QSignalBlocker() 都将不再起作用。
该函数于 Qt 6.7 中引入。
[noexcept] void QSignalBlocker::reblock()
在前一次调用unblock()之后,重新将信号设为阻塞状态。
reblock() 和unblock() 的调用次数不会被计数,因此每次调用 reblock() 都会撤销任意次数的unblock() 调用。
[noexcept] void QSignalBlocker::unblock()
将QObject::signalsBlocked()的状态临时恢复到QSignalBlocker 的构造函数执行之前的状态。若要撤销,请使用reblock()。
reblock() 和 unblock() 的调用次数不会被计数,因此每次调用 unblock() 都会撤销任意次数的reblock() 调用。
[noexcept] QSignalBlocker &QSignalBlocker::operator=(QSignalBlocker &&other)
将此信号阻断器从other 移动并赋值。other 将具有一个无操作的析构函数,而恢复QObject::signalsBlocked()状态的责任则转移至此对象。
该对象在被移动前被此信号阻断器阻断的信号(如有)将被解除阻断,除非在移动时,两个实例均阻断了同一对象的信号,且*this 已被解除阻断而other 尚未解除阻断。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.