Qt自学之路(二)-信号及槽机制

1、信号与槽机制介绍

        Qt提供信号与槽机制,用于类间通信。类似于观察者模式,信号相当于主题,槽相当于观察者。但是不同于观察者模式的地方为:

(1)槽可以连接多个信号

(2)信号可以跨线程通知槽。(队列连接)

2、信号

        (1)信号通过emit命令进行发送。例如:

        (2)不需要在cpp中书写实现。moc编译器会自动生成信号的实现代码。

        (3)信号按照槽连接的顺序通知槽。

3、槽

        (1)槽是一个常规的C++成员函数。他唯一特殊的地方为:它可以和信号进行连接

        (2)槽可以直接调用。也可以通过信号槽连接进行调用。

        (3)通过信号及槽连接进行调用,将忽略槽的访问级别。也就是说即使槽是私有的,也可以被其他类的对象通过信号槽连接进行调用。

4、信号和槽的连接

        (1)qobject基类提供两种类型的连接函数:

                1)基于成员函数指针方式

                2)基于字符串方式。

        (2) 信号和槽机制是类型安全的:Qt会检测信号与槽的签名式是否一致。

                1)对于基于函数指针方式的连接,编译器在编译阶段会检测信号与槽签名式是否一致。

                2)对于基于字符串方式的连接,Qt会在程序运行时检测信号与槽签名式是否一致

        (3)信号与槽连接类型:

                1)直接连接:当信号发送时槽会立即被调用。槽在信号所在线程中执行。(发送信号语句后面的语句将在槽返回后继续执行。)

                2)队列连接:当接收信号的对象所属线程返回到消息循环队列时槽才被执行。槽将在接收信号对象所属的线程中执行。发送信号的线程不被阻塞(emit语句后面的语句将继续执行)。

                3)阻塞队列连接:与队列连接类似。不同之处在于,发送信号的线程将被阻塞,直到槽返回才解除阻塞,继续执行。(这种连接不要用于接收对象所在线程与发送信号的在线程相同的情况中)

                4)唯一连接:此连接方式可以和前面几种连接方式进行组合。 在这种连接方式下, QObject::connect()当连接已经存在时将返回false。

                5)单次触发连接:这种连接方式可以与前面几种连接方式进行组合。在这种连接方式下,当槽被调用后会自动和信号进行解绑定。

        (4)信号和槽机制的开销问题。

                与直接调用函数相比,信号与槽机制会增加额外开销,但是这种开销并不显著。通过信号与槽机制调用一个函数的开销大概为直接调用一个非虚函数开销的十倍(小于new和delete的开销)。但是信号与槽机制带来的简便性及灵活性的回馈是值得付出这种开销的。往往用户不需要十分关注这些开销问题。

5、槽在哪个线程中被调用

        学习到队列消息的时候,我有点迷惑:到底槽在哪个线程中执行?后来阅读了QThread类的说明我找到了答案。

        (1)每个QObject子类对象都属于某个线程。

        (2)默认情况,一个对象属于创建它的线程。

        (3)可通过moveToThread函数改变一个对象所属线程,前提是这个对象的父亲必须为空。

        (4)当改变一个对象的线程时,他的儿子对象所属线程也会相应被修改。

        (5)当一个对象接收到一个队列信号或者一个被投递的事件时,他的槽和事件响应函数将在对象所属线程中执行。

        (6)如果一个对象没有所属线程,或者所属线程没有消息循环,那么他将无法接收队列信号或者被投递的事件。

                

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值