信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性。要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,为高层次的事件处理自动生成所需要的附加代码。
一、QT的信号和槽概述
信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性。要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的QT工具,该工具是一 C++预处理程序,为高层次的事件处理自动生成所需要的附加代码。
信号和槽能携带任意数量和任意类型的参数。我们可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接(当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行),甚至于将一个信号与另外一个信号相连接,这时无论名列前茅个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。
二、什么是信号
信号只需要在头文件中做声明,不需要在cpp中实现。放在QT自定义关键字signals下,在此之前一定要加上Q_OBJECT宏!
在编程中,一般使用的是控件内部定义好的信号。也可以自定义信号,并通过emit在代码中发射信号。
当然很多控件都提供了一般的信号,如果使用的时候查看帮助文档即可。
三、什么是槽函数
和普通的C++成员函数几乎是一样的。槽函数可以是虚函数,可以被重载,可以是public slots、protected slots、private slots,可以被其他C++成员函数直接调用;少数不同的是,槽还可以和信号连接在一起,在这种情况下,信号被发射时,会自动调用这个槽。
槽不需要信号传过来的参数时,可以不要参数;但槽一旦要参数,其参数个数,类型,顺序必须要和对应的信号保持一致。另外,槽的参数不能有缺省值。
同理和信号一样一般常用的槽函数对应的类会提供在帮助手册里面找即可。
四、自定义的信号槽注意事项
1.发送者和接收者都需要是 QObject 的子类(当然,槽函数是全局函数、Lambda表达式等无需接收者的时候除外);
2.信号和槽函数返回值是 void;
3.信号只需要声明,不需要实现;
4.槽函数需要声明也需要实现;
5.槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
6.使用 emit 在恰当的位置发送信号;
7.使用 connect()函数连接信号和槽;
8.如果信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少, 即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少)。
以上就是关于QT的信号和槽机制的知识希望对大家有帮助。