Mis*_*tyD 10 c++ qt qobject qt-signals qtcore
我想知道是否可以指定多种连接类型.例如,我希望我的连接类型是排队连接和唯一连接.是否可以在一个声明中指定?
QObject::connect(ptrSender,SIGNAL(..),ptrReceiver,SLOT(...),Queued-and-unique)
Run Code Online (Sandbox Code Playgroud)
更新:
根据海报的建议:
我试过用 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'
Run Code Online (Sandbox Code Playgroud)
lpa*_*app 14
是否可以在一个声明中指定?
从理论上讲,你的场景似乎是可能的.至少,您可以阅读有关它的文档文档.
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();
}
Run Code Online (Sandbox Code Playgroud)
这是可能的,但C++阻止以你的方式传递OR.
问题是connect采用类型的参数Qt::ConnectionType.对枚举中的两个值int进行按位OR运算会生成一个类型的值(枚举值经过整数提升,以便应用按位OR运算符).这会导致您获得的编译错误:
无法将参数5从'int'转换为'Qt :: ConnectionType'
(请记住,在C++积分中不会自动转换为枚举).
因此,解决方案是将OR的结果转换回正确的类型,并且使用的正确转换是static_cast:
static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection)
Run Code Online (Sandbox Code Playgroud)
现在你可能会问"Qt作者为什么不考虑这个"?嗯,事实是Qt::UniqueConnection在Qt 4.6中添加了.
之前,connect只采用单个枚举值,而不是它们的OR组合.这就是为什么connect有这个签名:
connect(..., Qt::ConnectionType)
Run Code Online (Sandbox Code Playgroud)
而不是这样的:
connect(..., QFlags<Qt::ConnectionType>)
connect(..., int)
Run Code Online (Sandbox Code Playgroud)
相反,它会允许OR.(注意,后两个签名也允许诸如Qt::DirectConnection | Qt::QueuedConnection没有意义的事情).
| 归档时间: |
|
| 查看次数: |
4277 次 |
| 最近记录: |