将QObject连接指定为唯一的正确方法是什么?

时间:2013-07-08 18:53:36

标签: c++ qt enums

Qt documentation为Qt :: ConnectionType提供以下值:

AutoConnection = 0;
DirectConnection = 1;
QueuedConnection = 2;
BlockingQueuedConnection = 4;
UniqueConnection = 0x80;

显然,这表明您可以建立BlockingQueuedConnectionUniqueConnection的连接。但是,仅将这两者与|运算符组合会导致编译器错误:

connect(foo, SIGNAL(bar()), this, SLOT(bar()),
        BlockingQueuedConnection | UniqueConnection));
error: invalid conversion from 'int' to 'Qt::ConnectionType'

所以必须输出参数:

connect(foo, SIGNAL(bar()), this, SLOT(bar()),
        (Qt::ConnectionType) (BlockingQueuedConnection | UniqueConnection)));

由于某些原因,在这种情况下, 感觉错误。这真的是建立唯一阻塞排队连接的合适方式吗?

5 个答案:

答案 0 :(得分:1)

Qt::ConnectionType不是旗帜。您不能在其上使用|运算符。您一次只能指定一个枚举值。

答案 1 :(得分:1)

Qt::UniqueConnection 0x80 

“这是一个可以与上述任何一种连接类型结合使用的标志,使用按位OR。

设置Qt::UniqueConnection时,如果连接已存在,QObject::connect()将失败(即,如果相同的信号已经连接到同一对对象的相同插槽)。
这个标志是在Qt 4.6中引入的。“(来自Qt5.0文档,http://qt-project.org/doc/qt-5.0/qtcore/qt.html#ConnectionType-enum

答案 2 :(得分:1)

我相信唯一可行的解​​决方案是施法,我使用了类似的东西:

static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection)

在我的代码中,它按预期工作。

答案 3 :(得分:1)

看起来像Qt bug,documentation says一件事:This is a flag that can be combined with any one of the above connection types, using a bitwise OR.,练习展示别的东西。至少QObject::connect代码looks fine

看起来应该有一些功能请求或错误报告给Qt。

我会通过定义一个函数来解决这个问题:

inline Qt::ConnectionType unique(Qt::ConnectionType typeOfConnection) {
    return static_cast<Qt::ConnectionType>(typeOfConnection | Qt::UniqueConnection);
}

由于IMO这个案例看起来会更好:

connect(foo, SIGNAL(bar()), this, SLOT(bar()),
        unique(Qt::BlockingQueuedConnection));

答案 4 :(得分:0)

根据文档,UniqueConnection就像AutoConnection;所以我想你只需要指定Qt::UniqueConnection,就是这样。 Qt将检测您是否处理不同的线程并采取相应的行为。