守卫类
类 Utils::Guard守卫类实现了带有锁定机制的递归守卫。更多...
头文件 | #include <Guard> |
详细描述
它可以作为 QSignalBlocker 的替代品。QSignalBlocker 会阻止对象的全部信号,这通常是不希望看到的。它也可能阻止对象本身内部需要的信号。Guard 和 GuardLocker 类则不会阻止任何信号。
当你调用一个可能发射你已连接的信号的对象的某个方法,并且你想要忽略这个通知时,你应该将 Guard 对象作为你的类成员,并在调用提到的方法之前只声明 GuardLocker 对象,如下所示
class MyClass : public QObject { \dots private: Guard updateGuard; // member of your class }; \dots void MyClass::updateOtherObject() { GuardLocker updatelocker(updateGuard); otherObject->update(); // this may trigger a signal }
在一个连接到其他对象信号的槽内部,你可能检查守卫是否已锁定,并在这种情况下忽略进一步的操作
void MyClass::otherObjectUpdated() { if (updateGuard.isLocked()) return; // we didn't trigger the update // so do update now \dots }
GuardLocker 在其析构函数中解开 Guard 锁。
Guard 对象是递归的,你可以为同一个 Guard 实例声明多个 GuardLocker 对象,只要至少有一个为 Guard 创建的 GuardLocker 对象在其作用域内,Guard 就会保持锁定状态。
©2024 Qt 公司 有限公司。在此包含的文档贡献是各自的版权所有者的版权。提供的文档在此许可下提供,许可条款为 GNU 自由文档许可证版本 1.3,由自由软件基金会发布。Qt 和相应的商标是芬兰 Qt 公司及其在全球各地的商标。所有其他商标均为各自所有者的财产。