(三)QT专题-槽的返回值调用;

2023-02-09  本文已影响0人  GoodTekken

槽的调用也可有返回值:
分为同步调用(Synchronous)和异步调用(Asynchronous)
同步调用:等待函数执行完成后,返回值。
异步调用:未等函数执行完成,马上有返回值。

①信号发送者和接受者在同一个线程,也就是直接连接,参数为Qt::DirectConnection。此时为同步调用,信号发送之后会等待槽函数的执行,可接收到返回值。

②当信号发送者和接受者不在同一个线程,也就是队列连接,参数为Qt::QueuedConnection时。此时为异步调用,信号发出之后,把事件交给事件队列,不等待槽函数的执行直接返回,不能接收到返回值。

③当信号的发送者和接受者不在同一个线程时,可以使用Qt::BlockingQueuedConnection参数,该参数会阻塞信号发送者所在线程,直到槽函数执行完成之后才会往下执行,可以接收到返回值。需要注意:如果信号的发送者和接受者在一个线程,使用该参数会造成程序死锁。

MyDemo.h:

#ifndef MYDEMO_H
#define MYDEMO_H

#include <QObject>
#include <QDebug>

class MyDemo : public QObject
{
    Q_OBJECT;

public:
    MyDemo(QObject *parent = nullptr);

    void demoTest(void);

signals:
    int mydemoSignal(int value);

public slots:
    int mydemoSlot(int value);
};
#endif // MYDEMO_H

MyDemo.cpp

#include "MyDemo.h"

MyDemo::MyDemo(QObject *parent):QObject(parent)
{
    connect(this,SIGNAL(mydemoSignal(int)),this,SLOT(mydemoSlot(int)));
}

void MyDemo::demoTest(void)
{
    connect(this,SIGNAL(mydemoSignal(int)),this,SLOT(mydemoSlot(int)),Qt::DirectConnection); //Synchronous
    //connect(this,SIGNAL(mydemoSignal(int)),this,SLOT(mydemoSlot(int)),Qt::QueuedConnection);//Asynchronous
    int result = emit mydemoSignal(30);
    qDebug()<<"demoTest return"<<result;
}

int MyDemo::mydemoSlot(int value)
{
    qDebug()<<"mydemoSlot"<<value;
    return value*2;
}
上一篇 下一篇

猜你喜欢

热点阅读