Qt - 信号与槽的连接方式

信号与槽的连接方式主要有以下5种方式:

Qt - 信号与槽的连接方式_第1张图片

先看代码:

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include 

class MyObject : public QObject
{
    Q_OBJECT
public:
    explicit MyObject(QObject *parent = 0);
    
signals:
    
protected slots:
    void testSlot();
};

#endif // MYOBJECT_H
#include "MyObject.h"
#include 
#include 

MyObject::MyObject(QObject *parent) :
    QObject(parent)
{
}

void MyObject::testSlot()
{
    qDebug() << "void MyObject::testSlot() tid = " << QThread::currentThreadId();
}

#ifndef TESTTHREAD_H
#define TESTTHREAD_H

#include 

class TestThread : public QThread
{
    Q_OBJECT

protected:
    void run();
public:
    explicit TestThread(QObject *parent = 0);
    
signals:
    void testSignal();

};

#endif // TESTTHREAD_H
#include "TestThread.h"
#include 

TestThread::TestThread(QObject *parent) :
    QThread(parent)
{

}

void TestThread::run()
{
    qDebug() << "void TestThread::run() -- begin tid = " << currentThreadId();

    for(int i=0; i<3; i++)
    {
        qDebug() << "void TestThread::run() i = " << i;

        sleep(1);
    }

    emit testSignal();
    
    qDebug() << "signal sended";

    //exec();//测试Directconnect的时候屏蔽掉 其它时候打开事件循环函数

    qDebug() << "void TestThread::run() -- end";
}


Qt::DirectConnection( 立即调用 )

Qt - 信号与槽的连接方式_第2张图片

 结论:发送信号的时候关联的槽函数被发送信号的线程所调用-立即执行(无论这个槽函数所属的对象依附哪个线程)            重要(该连接方式 不需要启动事件循环方式)

Qt::QUeuedConnection ( 异步调用 )

Qt - 信号与槽的连接方式_第3张图片

 结论:信号发送至目标线程中事件队列中 ,等待被执行,当前线程继续往下执行。

Qt::BlockingQueuedConnection ( 同步调用 )

Qt - 信号与槽的连接方式_第4张图片

 结论:信号发送至目标线程的事件队列中,当前线程阻塞等待槽函数执行完成之后再继续往下执行。

Qt::AutoConnection ( 默认连接 )

当所属槽函数的对象与发送信号处于同一个线程的时候 调用Qt::Directconnect,否则调用异步调用。

Qt - 信号与槽的连接方式_第5张图片

 Qt::UniqueConnection ( 单一连接 )

 Qt - 信号与槽的连接方式_第6张图片

 结论:当 Qt::UniqueConnection 被设置时,如果连接已经存在(即如果相同的信号已经连接到相同对象对的相同插槽),则 QObject::connect() 将失败。

你可能感兴趣的:(Qt基础知识,Qt多线程使用,qt)