1

Qt 文档为 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)));

由于某种原因,在这种情况下,铸造感觉不对。这真的是建立独特的阻塞队列连接的合适方法吗?

4

5 回答 5

1

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

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

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

于 2014-03-28T16:01:18.827 回答
1

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

于 2013-07-08T19:04:18.237 回答
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 )

于 2013-08-08T03:16:14.210 回答
1

看起来像 Qt 错误,文档说一件事:This is a flag that can be combined with any one of the above connection types, using a bitwise OR.,练习显示另一件事。至少QObject::connect代码看起来不错

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

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

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

由于国际海事组织,这种情况下看起来会更好:

connect(foo, SIGNAL(bar()), this, SLOT(bar()),
        unique(Qt::BlockingQueuedConnection));
于 2014-03-28T16:52:12.920 回答
0

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

于 2013-07-08T19:15:13.537 回答