守卫类

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 公司及其在全球各地的商标。所有其他商标均为各自所有者的财产。