Qt 信号与槽connect()的连接方式和emit 返回值

本文介绍了Qt中emit signal()的返回值处理以及信号与槽连接connect()的五种方式:自动连接、直接连接、队列连接、阻塞连接和唯一连接。特别强调在多线程环境下,为了实现实时调用槽函数并获取返回值,需要使用Qt::BlockingQueuedConnection来避免异步执行导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

emit signal()的返回值

众所周知,emit是发送信号时用的,我们还可以使用emit 传回槽函数执行完的返回值。
如下:

class testOne : public QDialog
{
    Q_OBJECT
public:
    explicit testOne(QWidget *parent = nullptr);
    ~testOne();
signals:
	bool isFlag();
private:
	testTwo  testObject;
public slots:	
};

testOne::testOne(QWidget *parent) :
    QDialog(parent)
{
    connect(this, SIGNAL(isFlag()), testObject, SLOT(retFlag()),Qt::BlockingQueuedConnection);
    bool flag = emit isFlag();
    if(flag==true){
    	qDebug()<<"Success!";
    }else{
    	qDebug()<<"Fail!";
	}
}

class testTwo : public QDialog
{
    Q_OBJECT
public:
    explicit testTwo(QWidget *parent = nullptr);
    ~testTwo();
private:
public slots:
	bool retFlag();
};

bool testTwo::retFlag()
{
	return true;
}

当然也可以通过函数参数传值。

信号与槽连接connect()的第五个参数

一般我们写信号与槽的连接关系都会忽略第五个参数,通常默认的方式就是自动连接参数,Qt::connectionType=Qt::AutoConnectType。

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
const QObject *sender,    //信号发送对象指针
const char *signal,       //信号函数字符串,使用SIGNAL()
const QObject *receiver,  //槽函数对象指针
const char *member,       //槽函数字符串,使用SLOT()
Qt::connectionType=Qt::AutoConnectType,

Qt::AutoConnection
自动连接:默认的方式。

Qt::DirectConnection
直接连接:相当于直接调用槽函数。

Qt::QueuedConnection
队列连接:内部通过postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。如果信号参数是引用类型,则会另外复制一份的。线程安全的。

Qt::BlockingQueuedConnection
阻塞连接:此连接方式只能用于信号发出的线程 和 槽函数的对象不再一个线程中才能用。通过信号量+postEvent实现的。不是实时调用的,槽函数永远在槽函数对象所在的线程中执行。但是发出信号后,当前线程会阻塞,等待槽函数执行完毕后才继续执行。

Qt::UniqueConnection
防止重复连接。

以上是connect()五种的连接方式,为什么要突然说这五种联系方式尼,因为我在一个项目中使用到了信号与槽connect(),因为信号与槽不在同一个线程中,如果使用默认的连接方式Qt::AutoConnection的话,在不同的线程中连接方式就会变成了Qt::QueuedConnection, 就会导致在使用emit signal()时,槽函数并不是实时调用,而是执行完emit signal();语句后才去执行槽函数的内容。 这导致如果我们想获取执行完emit signal()语句后槽函数的返回值,结果就不是我们想要的了,所以需要我们手动去配置连接方式,如果在信号和槽在不同线程中,而且我们需要实时的调用槽函数,那么需要在第五个参数中配置Qt::BlockingQueuedConnection

 connect(sender, SIGNAL(signal()), receiver, SLOT(slot()),Qt::BlockingQueuedConnection);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赟赟、嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值