本篇博客将深入讨论信号与槽,重点讨论信号与槽的连接方式。信号与槽的连接方式还有什么值得我们注意的地方吗?
之前是如何连接信号与槽的呢?
通过connect函数将指定的信号连接到指定的槽函数上面,接下来将要发生的事情就是信号一旦被发射,相应的槽函数就会被调用。这是我们最直观的认识。
每次调用connect函数时,都省略了这个函数的第5个参数,使我们误以为connect函数就只有4个参数。connect函数其实有5个参数,最后一个参数就是指定信号与槽的连接方式。然而,信号与槽的连接方式也是Qt中多线程编程的难点之一了

深入信号与槽的连接方式
-Qt::DirectConnection(立即调用)
-Qt::QueuedConnection(异步调用)
-Qt::BlockingQueuedConnection(同步调用)
-Qt::AutoConnection(默认连接)
-Qt::UniqueConnection(单一连接)

小知识

bool connect(const QObject* sender,
            const char* signal,
            const QObject* receiver,
            const char* method,
            Qt::ConnectType type = Qt::AutoConnection);

信号与槽的连接方式决定槽函数调用时的相关行为

知识回顾
-每一个线程都有自己的事件队列(一定要熟记,Qt中的每一个线程都有自己的事件队列)
-线程通过事件队列接收信号
-信号在事件循环中被处理

在发射信号的时候,好像并没有指定发射到哪个线程里面去。那么Qt这个平台是如何知道将发射了的信号投递到哪个线程的事件队列中的呢?
依据的就是对象的依附性。看下面的示意图:

信号与槽的连接方式


在线程1中要发射1个我们自定义的信号,发射之后就进入某个线程的事件队列中去了,那如何决定哪个线程的事件队列呢?
其实就是由对象的依附性决定的,
在发射信号之前,通过connect函数将signal信号连接到obj里面的slot函数上,根据线程的依附性就可以知道,emit signal这条语句执行之后,
signal信号就直接进入到线程2的事件队列,在事件队列中又能干什么呢?什么都干不了。因此就要求线程2开启事件循环,线程2一旦开启事件循环,就会从事件队列中取发射过来的信号了。之后就根据连接调用obj中的slot槽函数了。

 信号与槽的连接方式:

1.立即调用

信号与槽的连接方式

信号与槽的连接方式为立即调用,代码示例如下:

MyObject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>

class MyObject : public QObject
{
    Q_OBJECT

public:
    explicit MyObject(QObject* parent = 0);

signals:

protected slots:
    void testSlot();
};

#endif // MYOBJECT_H
View Code

相关文章: