Qt5:连接:如果插槽的参数少于信号,如何使用“连接”

时间:2018-09-18 13:39:22

标签: c++ qt c++11 qt5

任务是将具有一个参数的一个信号连接到具有零参数的插槽。使用“旧的” Qt4连接方式,它的工作原理如下

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

但是,如果我想使用类型安全的Qt5-连接怎么办?

文档仅提及以下情况:

  • 连接到插槽中的默认参数

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

3 个答案:

答案 0 :(得分:6)

Qt5样式的连接机制忽略信号的额外参数,就像您可以在Qt4样式中指定的那样:

  

信号和插槽机制是安全类型:信号的签名必须与接收插槽的签名匹配。 (实际上,插槽的签名可能比接收到的信号短,因为它可以忽略其他参数。)由于签名是兼容的,因此编译器可以帮助我们在使用函数指针时检测类型不匹配的情况,基于语法。基于字符串的SIGNAL和SLOT语法将在运行时检测类型不匹配。

来自Qt Docs(重点是我)。

因此您可以使用这种新样式:

connect(&object1, &ClassObject1::signal, &object2, &ClassObject2::slot);

答案 1 :(得分:0)

您可以毫无问题地作为Qt4-Way连接。唯一不能做的就是连接参数较少的插槽。

答案 2 :(得分:0)

Nevermind,找到了一种无需声明和定义额外插槽即可处理此问题的方法:解决方案是使用Lambda来消除其他参数。

示例(如果object2是我们自己的项目,则为this)。 遵循问题中的命名方式:

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