信号槽的概念与使用

下面对Qt所设计的信号槽机制进行解析,部分摘自网络。

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

槽:
用于接收信号,而且槽只是普通的对象成员函数。
一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。

信号与槽的连接:

所有从 QObject 或其子类 ( 例如 Qwidget ) 继承的类都能够包含信号和槽。
因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。

connect(sender, SIGNAL(signal), receiver, SLOT(slot));


如下例中的:
QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
其中,SIGNAL() 与 SLOT() 是转换信号与槽的宏。

注意:

一个信号可以连接多个槽,
当信号发生,会以不确定的顺序一个接一个的调用各个槽。

多个信号可以连接同一个槽,
即无论是发生哪个信号,都会调用这个槽。

信号之间可以相互连接,
第一个信号发生,也会发生第二个信号。

连接可以被移除,
这种情况用得比较少,因为对象被销毁时,Qt会自动移除与这个对象相关的所有连接。代码如下:

disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
如果一个信号与多个槽相联系的话,那么,当这个信号发生时,与之相关的槽被调用的顺序将是随机的。

宏定义不能用在 signal 和 slot 的参数中。

信号和槽的参数个数与类型必须一致。

凡是定义信号槽的类都必须写Q_OBJECT宏。
只有加入了Q_OBJECT,你才能使用QT中的signal和slot机制。

例:

#include <QtGui/QApplication>
#include <QtGui/QPushButton>
int main(int argc, char *argv[])
{
        QApplication a(argc, argv);
        QPushButton *button = new QPushButton("Quit");
        QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
        button->show();
        return a.exec();
}
关于 QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit())); :

QObject是所有类的根。
Qt使用这个QObject实现了一个单根继承的C++。
它里面有一个connect静态函数,用于连接信号槽。

代码详解:
当点击button的时候,a的quit函数被调用,程序退出。
所以,在这里,clicked()就是一个信号,而quit()就是槽,形象地说就是把这个信号插进这个槽里面去。






  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值