槽的调用也可有返回值:
分为同步调用(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;
}
网友评论