SIGNAL& Qt中的SLOT宏

时间:2015-07-23 13:52:19

标签: qt macros signals slot

我是Qt的初学者,当我尝试使用connect方法绑定信号和插槽时,我参考了我找到标准用法的例子。它是:

connect(obj1, SIGNAL(signal(int)), obj2, SLOT(slot()))

但是当我用作

connect(obj1, &Obj1::signal, obj2, &Obj2::slot)

它也运作良好,因此我遇到一个问题:宏SIGNALSLOT究竟做了什么?他们只是在对象所属的类中查找信号并返回它的地址吗?

那么为什么大多数程序员使用这些宏而不是使用类似&Obj1::signal,因为后者看起来更简单,在更改信号参数时不需要编辑代码?

4 个答案:

答案 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的部分:

documentation was updated for Qt 5

此外,还有关于Qt 4连接工作here和Qt 5 here的好文章。

答案 1 :(得分:2)

除了第一个答案。

  

宏信号和SLOT究竟做了什么

几乎没有。查看assertEqual

qobjectdefs.h

它只是添加# define SLOT(a) "1"#a # define SIGNAL(a) "2"#a 1。这意味着下一个代码有效并按预期工作:

2
  

为什么大多数程序员使用这些宏而不是使用like   &安培; OBJ1 ::信号

More details here.

答案 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表达式
  •