【QT】信号槽机制

声明一个信号要使用signals关键字,在signals前面不能使用public、private和protected等限定符,因为只有定义该信号的类及其子类才可以发射该信号。而且信号只用声明,不需要也不能对它进行定义实现。

声明一个槽需要使用slots关键字。一个槽可以是private、public或者protected类型的,槽也可以被声明为虚函数,这与普通的成员函数是一样的,也可以像调用一个普通函数一样来调用槽。槽的最大特点就是可以和信号关联。

connect函数

bool QObject::connect ( const QObject *sender, const char * signal, const QObject * receiver, const char * method,Qt::ConnectionType type = Qt::AutoConnection )
  • 第一个参数为发送信号的对象,例如这里的dlg;
  • 第二个参数是要发送的信号,这里是SIGNAL(dlgReturn(int));
  • 第三个参数是接收信号的对象,这里是this,表明是本部件,即Widget,当这个参数为this时,也可以将这个参数省略掉,因为connect()函数还有另外一个重载形式,该参数默认为this;
  • 第四个参数是要执行的槽,这里是SLOT(showValue(int))。对于信号和槽,必须使用SIGNAL()和SLOT()宏,它们可以将其参数转化为const char*类型。

connect()函数的返回值为bool类型,当关联成功时返回true。还要注意,在调用这个函数时信号和槽的参数只能有类型,不能有变量,例如写成SLOT(showValue(int
value))是不对的。
对于信号和槽的参数问题,基本原则是信号中的参数类型要和槽中的参数类型相对应,而且信号中的参数可以多于槽中的参数,但是不能反过来,如果信号中有多余的参数,那么它们将被忽略。

  • 最后一个参数,它表明了关联的方式,其默认值是Qt::AutoConnection,这里还有其他几个选择,在编程中一般使用默认值,也可以将这个参数改为Qt::QueuedConnection,这样在执行完emit语句后便会立即执行其后面的代码,而不管槽是否已经执行。当不再使用这个关联时,还可以使用disconnect()函数来断开关联。

使用信号和槽应该注意的几点:

  • 需要继承自QObject或其子类;

  • 在类声明的最开始处添加Q_OBJECT宏;

  • 槽中的参数的类型要和信号的参数的类型相对应,且不能比信号的参数多;

  • 信号只用声明,没有定义,且返回值为void类型。

信号和槽机制的特色和优越性:

  • 信号和槽机制是类型安全的,相关联的信号和槽的参数必须匹配;
  • 信号和槽是松耦合的,信号发送者不知道也不需要知道接受者的信息;
  • 信号和槽可以使用任意类型的任意数量的参数。

虽然信号和槽机制提供了高度的灵活性,但就其性能而言,还是慢于回调机制的。当然,这点性能差异通常在一个应用程序中是很难体现出来的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值