QT的信号-槽机制

先举例:

QObject::connect(ui->searchButton,SIGNAL(clicked()),this,SLOT(searchSlot()));

QT利用信号-槽机制完成按钮与函数之间的关联。

  • 信号
    当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。

  • 用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。
  • 信号与槽的连接
    所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。
connect(sender, SIGNAL(signal), receiver, SLOT(slot));

调用QObject下的connect函数,将信号与槽关联起来。当ui下的searchButton触发clicked()函数时(注意,这个clicked函数并没有指定的接受对象,它是全局的),searchSlot()便会执行。


应该注意的问题:

  • 信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。
  • 如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。
  • 宏定义不能用在 signal 和 slot 的参数中。
  • 信号和槽的参数个数与类型必须一致。