我想知道是否可以指定多种连接类型。例如,我希望我的连接类型是排队连接和唯一连接。是否可以在一个声明中指定它?
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'
答案 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,允许将其与其他连接类型组合。