Qt:使用QObject :: connect指定多个连接类型

时间:2013-12-21 09:31:45

标签: c++ qt qobject qtcore qt-signals

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

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'

3 个答案:

答案 0 :(得分:14)

  

是否可以在一个声明中指定?

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

  

Qt :: UniqueConnection 0x80这是一个可以使用按位OR与上述任何一种连接类型组合的标志。当设置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();
}

答案 1 :(得分:7)

这可能是,但是C ++会阻止以你的方式传递OR。

问题是connect采用Qt::ConnectionType类型的参数。 对枚举中的两个值进行按位OR运算会生成类型int 的值(枚举值经过整数提升以便应用按位OR运算符)。这会导致您收到的编译错误:

  

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

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

因此解决方案是将OR的结果转换回正确的类型,并使用正确的强制转换为static_cast

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

现在你可能会问“为什么Qt作者没有想到这个”?好吧,事实是在Qt 4.6 中添加了 Qt::UniqueConnection

之前,connect只采用了一个枚举值,而不是它们的OR组合。这就是为什么connect有这个签名的原因:

connect(..., Qt::ConnectionType)

而不是这样:

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

而是允许OR。 (请注意,后两个签名也允许使用Qt::DirectConnection | Qt::QueuedConnection之类的内容,这些内容没有意义。)

答案 2 :(得分:1)

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

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

检查文档:connection type

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