Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:使用QObject::connect指定多个连接类型_C++_Qt_Qobject_Qtcore_Qt Signals - Fatal编程技术网

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