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

Qt: Specifying multiple connection types with QObject::connect

本文关键字:类型 连接 使用 QObject connect Qt      更新时间:2023-10-16

我想知道是否可以指定多种连接类型。例如,我希望我的连接类型是排队连接和唯一连接。有可能在一句话中具体说明吗?

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'

是否可以在一条语句中指定?

理论上,对于您的场景来说,这似乎是可能的。至少,你可以阅读有关它的文档

Qt::UniqueConnection 0x80这是一个可以与上述任何一种连接类型组合的标志,使用按位OR。设置Qt::UniqueConnection时,如果连接已存在(即,如果同一信号已连接到同一对对象的同一插槽),则QObject::connect()将失败。此标志在问题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();
}

这是可能的,但C++阻止以您正在执行的方式传递OR。

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

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

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

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

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

现在你可能会问"为什么Qt作者没有考虑这个"?事实上,Qt::UniqueConnection已添加到Qt 4.6

以前,connect只取一个枚举值,而不是它们的OR组合。这就是为什么connect有这个签名:

connect(..., Qt::ConnectionType)

而不是像这样的东西:

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

这反而会允许OR。(请注意,后两个签名也允许Qt::DirectConnection | Qt::QueuedConnection之类的东西,这是没有意义的)。

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

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

检查文档:连接类型

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