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

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)


pep*_*ppe 7

这是可能的,但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没有意义的事情).