11

我想知道是否可以指定多种连接类型。例如,我希望我的连接类型是排队连接和唯一连接。是否可以在一个语句中指定?

QObject::connect(ptrSender,SIGNAL(..),ptrReceiver,SLOT(...),Queued-and-unique)

更新 :

根据海报的建议:

我尝试使用 Qt::QueuedConnection | Qt::UniqueConnection但我得到了

 `Error 1   error C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)' : cannot convert parameter 5 from 'int' to 'Qt::ConnectionType'
4

3 回答 3

14

是否可以在一个语句中指定?

从理论上讲,您的情况似乎是可能的。至少,您可以阅读有关它的 docs文档

Qt::UniqueConnection 0x80 这是一个可以与上述任何一种连接类型组合的标志,使用按位或。当设置了 Qt::UniqueConnection 时,如果连接已经存在(即如果相同的信号已经连接到同一对对象的相同槽),QObject::connect() 将失败。这个标志是在 Qt 4.6 中引入的。

根据上述文档,您将编写如下内容:

#include <QCoreApplication>

int main(int argc, char **argv)
{
    QCoreApplication coreApplication(argc, argv);
    QObject::connect(&coreApplication, SIGNAL(aboutToQuit()), &coreApplication, SLOT(quit()), static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection));
    return coreApplication.exec();
}
于 2013-12-21T09:40:24.773 回答
8

这是可能的,但 C++ 会阻止以您正在执行的方式传递 OR。

问题是它connect需要一个 type 的参数Qt::ConnectionType对枚举中的两个值进行按位或运算会产生一个类型int的值(枚举值经过整数提升以应用按位或运算符)。这会导致您得到的编译错误:

无法将参数 5 从“int”转换为“Qt::ConnectionType”

(请记住,在 C++ 中,积分不会自动转换为枚举)。

所以解决方案是将 OR 的结果转换为正确的类型,使用的正确转换是static_cast

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

现在你可能会问“为什么 Qt 作者没有考虑到这一点”?好吧,事实是Qt::UniqueConnectionQt 4.6 中添加了它

以前,connect只取一个枚举值,而不是它们的 OR 组合。这就是为什么connect有这个签名:

connect(..., Qt::ConnectionType)

而不是这样的:

connect(..., QFlags<Qt::ConnectionType>)
connect(..., int)

相反,它会允许 OR。(请注意,后两个签名也允许诸如Qt::DirectConnection | Qt::QueuedConnection,这没有意义)。

于 2013-12-21T10:29:18.283 回答
1

当然,这是可能的。因为Qt::UniqueConnection是一个可以与任何其他连接类型组合的标志,使用按位或。

QObject::connect(ptrSender,SIGNAL(..),ptrReceiver,SLOT(...), Qt::UniqueConnection | Qt::QueuedConnection);

检查文档:连接类型

在 Qt v. 4.8Qt::UniqueConnection中也有值 0x80,它允许将它与其他连接类型结合起来。

于 2013-12-21T09:41:59.523 回答