C++ Qt:使用QObject::connect指定多个连接类型
我想知道是否可以指定多种连接类型。例如,我希望我的连接类型是排队连接和唯一连接。可以在一个语句中指定吗C++ Qt:使用QObject::connect指定多个连接类型,c++,qt,qobject,qtcore,qt-signals,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(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'
可以在一个语句中指定吗
QObject::connect(ptrSender,SIGNAL(..),ptrReceiver,SLOT(...),Queued-and-unique)
从理论上讲,对于您的场景来说,这似乎是可能的。至少,你可以阅读有关它的文档
UniqueConnection 0x80这是一个标志,可以使用按位OR键与上述任何一种连接类型组合。设置Qt::UniqueConnection时,如果连接已经存在(即,如果相同的信号已经连接到同一对对象的同一插槽),则QObject::connect()将失败。Qt4.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();
}
connect(..., QFlags<Qt::ConnectionType>)
connect(..., int)
#包括
int main(int argc,字符**argv)
{
QCoreApplication coreApplication(argc、argv);
QObject::connect(&coreApplication,SIGNAL(aboutToQuit()),&coreApplication,SLOT(quit()),static_cast(Qt::QueuedConnection | Qt::UniqueConnection));
返回coreApplication.exec();
}
当然,这是可能的。因为Qt::UniqueConnection
是一个可以与任何其他连接类型组合的标志,使用按位或
QObject::connect(ptrSender,信号(…),ptr接收器,插槽(…),Qt::UniqueConnection | Qt::QueuedConnection)代码>
检查文件:
在Qt v。4.8代码> Qt::UNIQUIONECTION/CODE >也有值0x80,它允许将它与其他连接类型结合。 可能,但是C++阻止传递OR或以您的方式传递。
问题是,
connect
接受类型为Qt::ConnectionType
的参数对枚举中的两个值进行按位或运算,生成类型为int
(枚举值经过整数提升以应用按位或运算符)。这会导致出现编译错误:
无法将参数5从“int”转换为“Qt::ConnectionType”
(记住C++中的积分不自动转换成枚举)。< /P>
因此,解决方案是将OR的结果强制转换回正确的类型,而要使用的正确强制转换是
static\u cast
:
static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection)
不是这样的:
#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();
}
connect(..., QFlags<Qt::ConnectionType>)
connect(..., int)
connect(…,QFlags)
连接(…,int)
相反,它会允许使用OR。(请注意,后两个签名还允许诸如Qt::DirectConnection | Qt::QueuedConnection
,这是没有意义的)。错误1错误C2664:'QMetaObject::Connection QObject::Connection::connect(const QObject*,const char*,const QObject*,const char*,Qt::ConnectionType)“:无法将参数5从“int”转换为“Qt::ConnectionType”
这是我使用Qt::QueuedConnection | Qt::UniqueConnection
时使用的,实际上Qt::AutoCompatConnection
的值为3,等于Qt::DirectConnection | Qt::QueuedConnection
。