Qt documentation为Qt :: ConnectionType提供以下值:
AutoConnection = 0;
DirectConnection = 1;
QueuedConnection = 2;
BlockingQueuedConnection = 4;
UniqueConnection = 0x80;
显然,这表明您可以建立BlockingQueuedConnection
和UniqueConnection
的连接。但是,仅将这两者与|
运算符组合会导致编译器错误:
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)));
由于某些原因,在这种情况下, 感觉错误。这真的是建立唯一阻塞排队连接的合适方式吗?
答案 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将检测您是否处理不同的线程并采取相应的行为。