我是Qt的初学者,当我尝试使用connect
方法绑定信号和插槽时,我参考了我找到标准用法的例子。它是:
connect(obj1, SIGNAL(signal(int)), obj2, SLOT(slot()))
但是当我用作
时connect(obj1, &Obj1::signal, obj2, &Obj2::slot)
它也运作良好,因此我遇到一个问题:宏SIGNAL
和SLOT
究竟做了什么?他们只是在对象所属的类中查找信号并返回它的地址吗?
那么为什么大多数程序员使用这些宏而不是使用类似&Obj1::signal
,因为后者看起来更简单,在更改信号参数时不需要编辑代码?
答案 0 :(得分:4)
在Qt 5之前,使用rabbitmqctl set_parameter shovel my-shovel '{"src-uri": "amqp://localhost", "src-queue": "myQueue", \
"dest-uri": "amqp://localhost", "dest-queue": "test3"}'
和SIGNAL
宏是唯一的连接方式。连接是在运行时进行的,需要在标题中标记信号和插槽。例如:
SLOT
为了避免重复,它的工作方式是in the QT 4 documentation。
信号和插槽机制是Qt提供的C ++扩展的一部分,并使用Meta Object Compiler (moc)。
This解释了为什么信号和插槽使用moc。
第二个连接方法得到了很大改进,因为在编译时可以检查指定的函数,而不是运行时。此外,通过使用函数的地址,您可以引用任何类函数,而不仅仅是标记为 slots的部分:
答案 1 :(得分:2)
除了第一个答案。
宏信号和SLOT究竟做了什么
几乎没有。查看assertEqual
:
qobjectdefs.h
它只是添加# define SLOT(a) "1"#a
# define SIGNAL(a) "2"#a
或1
。这意味着下一个代码有效并按预期工作:
2
为什么大多数程序员使用这些宏而不是使用like &安培; OBJ1 ::信号
答案 2 :(得分:0)
要完成TheDarkKnight's answer,使用函数地址重构使用旧Qt 4 SIGNAL和SLOT宏到Qt 5的新语法的遗留代码是一种很好的做法。
突然,连接错误将出现在编译时而不是在运行时!制作Qt 4连接错误非常容易,因为任何拼写错误都会导致这样的错误。另外,函数的名称必须是完全限定的名称,即前面有完整的命名空间(如果有的话)。
另一个好处是能够将lambda用于槽函数,如果槽体很简单,可以减少命名函数的需要。
答案 3 :(得分:0)
这些宏仅将其参数转换为特定于信号/插槽的字符串。 Differences between String-Based and Functor-Based Connections可以在文档中找到。简而言之:
基于字符串:
- 类型检查在运行时完成
- 可以将信号连接到参数比信号更多的插槽(使用默认参数)
- 可以将C ++函数连接到QML函数
基于功能符:
- 类型检查在编译时完成
- 可以执行隐式类型转换
- 可以将信号连接到lambda表达式