Qt:使用QObject::connect指定多个连接类型
Qt: Specifying multiple connection types with QObject::connect
我想知道是否可以指定多种连接类型。例如,我希望我的连接类型是排队连接和唯一连接。有可能在一句话中具体说明吗?
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,这允许将其与其他连接类型组合。
- C++将两个不同类型的向量的属性连接到新的向量中
- C++ 将不同的类型连接成函数的字符串
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 如何编写模板函数来添加整数但连接字符串和字符类型?
- 如何使用指针连接两种不同的节点类型(结构)?
- 尝试连接两种不同类型的结构来创建链表
- 如何连接二进制宏值?什么是二进制类型
- 查找树(不属于任何特定类型的简单连接树)中两个节点之间的路径
- <T> 在使用运算符+ 连接两个向量之前从类型向量中删除索引
- 在参数包中获取函数指针的返回类型,并将其保存为与其他参数连接的元组
- C++中将不同类型的变量列表连接到逗号分隔字符串的最快方法是什么?
- Qt:使用QObject::connect指定多个连接类型
- 错误:在“连接”中请求成员“板”,该“板”属于非类类型“游戏*”
- 将字符数组解释为多个连接的数据类型
- 正在将QAxObject事件与IDispatch*类型的参数连接
- 如何在 Boost.ASIO 中分配已连接的本机套接字类型 (TCP)
- 通过将模板参数与字符串连接起来生成C++类型名
- 线程之间的Qt连接类型:为什么这样做
- 除了字符串流,还有其他方法吗?连接一个由多种类型的变量组成的字符串
- 使用QObject::connect()时,类型签名是否重要,用于将函数连接到信号