Qt5:connect:如果槽有比信号更少的参数,如何在'connect'中使用

4

任务是将一个带有一个参数的信号连接到一个不带参数的槽上。使用“旧”的Qt4连接方式,操作如下:

connect(object1, SIGNAL(signal(int param)), object2, SLOT(slot()))

但是如果我想使用类型安全的Qt5-connects呢?

文档只提到了以下情况:

  • 连接到槽中的默认参数

  • 并使用上述基于字符串的连接方式。


不,因为我想要使用Qt5的方式,而不是在语法中使用SIGNAL/SLOT。同时也不想使用额外的“缓冲区”槽。因此,bunto1的答案是合适的。 - Marcel Petrick
3个回答

9
Qt5风格的连接机制和Qt4风格一样忽略信号中的额外参数:
信号槽机制是类型安全的:信号的签名必须与接收槽的签名匹配。实际上,槽可以比其接收的信号具有更短的签名,因为它可以忽略额外的参数。由于这些签名是兼容的,编译器可以帮助我们在使用基于函数指针的语法时检测类型不匹配。基于字符串的SIGNAL和SLOT语法将在运行时检测类型不匹配。
来自Qt文档(重点是我的)。
所以您可以像这样使用新样式:
connect(&object1, &ClassObject1::signal, &object2, &ClassObject2::slot);

看到您的评论后,我再次尝试了这种情况并编译成功了。我被迫猜测我的初始代码可能有其他问题(我曾经解释错误)。谢谢。 - Marcel Petrick
2
@MarcelPetrick 如果两种方法都被重载了,它会抱怨有歧义。你可能需要使用 qOverload<int>(&ClassObject1::signal) 或类似的方式。 - Caleth

0
没关系,找到了一种处理这个问题的方法,而不需要声明和定义一个额外的插槽:解决方案是使用lambda函数来消除额外的参数。
示例(假设object2是我们自己的项目(this)。 按照问题中的命名风格进行操作:

connect(object1, &Object1::signal, [this](int) { slot(); } );

0

您可以按照Qt4的方式进行连接,没有问题。唯一无法做到的是使用参数较少的插槽进行连接。


1
但是使用新的类型安全语法更受欢迎,因为它可以在编译时检测到更多的问题,并且在运行时也更快。 - Jesper Juhl
@JesperJuhl 我认为他的意思是“你可以像在Qt4中那样使用类型安全连接,而不会出现问题。” - bunto1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接