Qt 使用C++特性“引用” - 获得槽函数的返回值

QT信号与槽中,槽函数是可以定义有返回值的,但是我们都是在connect函数中进行调用,那么该如何获得调用后的槽函数的返回值呢?
答案是不可能获得了的!

槽函数虽然可以定义返回值类型,但其实他和信号一样是不支持有返回值类型的,即使你定义了,也是没有用处的,所以我们在定义信号和槽函数时一般都是使用void类型进行修饰。
信号和槽函数都可以带参数.

所以,想要获得槽函数里的计算的结果,就得使用到引用类型


具体操作如下:

  1. 定义信号,信号中添加引用类型的参数参数;

     signals:
    	void sign(bool &bFlag);
    
  2. 定义槽函数,槽函数中必须有和信号一致的引用类型的参数;

    private slots:
    	void getBFlag(bool &bFlag);
    
  3. 将信号与槽进行连接;

    connect(this, &QtWidgetsApplication1::sign, this, &QtWidgetsApplication1::getBFlag);
    
  4. 实现槽函;

    void QtWidgetsApplication1::getBFlag(bool &bFlag) {
    	// 通过引用返回需要的值
    	bFlag = true;
    }
    
  5. 使用emit触发信号,并获得需要的值

    bool bFlag = false;
    // 发射信号,触发槽函数(通过引用带回所需要的值)
    emit sign(bFlag);	
    

通过以上的五个步骤,就可以获得在槽函数中返回的结果。
这种用法在项目中是很常用的,所以说是必须掌握的知识点!

测试结果:
在这里插入图片描述

在这里插入图片描述

@ 这是什么原理呢?
信号中直接有一个引用类型的变量,槽函数改变了该引用,待槽函数执行完毕之后,信号中的引用也就改变了。

槽函数不允许有返回值,所有的槽函数都是void开头的,想得到槽函数修改后的数据,引用是最方便的。


以下是全部实现代码:

.h文件

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication1.h"
#include <QPushButton>
#include <QLabel>
#include <QGridLayout>

#pragma execution_character_set("utf-8")    // qt显示中文

class QtWidgetsApplication1 : public QMainWindow
{
    Q_OBJECT

public:
    QtWidgetsApplication1(QWidget *parent = Q_NULLPTR);

signals:
	void sign(bool &bFlag);

private slots:
	void getBFlag(bool &bFlag);

	void on_m_testBtn_clicked();

private:
    Ui::QtWidgetsApplication1Class ui;

private:
	QPushButton *m_testBtn;
	QLabel *m_titleLabel;
	QGridLayout *m_layout;
};

.cpp文件

#include "QtWidgetsApplication1.h"

QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent) : QMainWindow(parent) {

	ui.setupUi(this);

	m_testBtn = new QPushButton("测试");
	m_titleLabel = new QLabel("等待测试");
	m_layout = new QGridLayout(this);

	// 布局添加部件
	m_layout->addWidget(m_titleLabel, 0, 0, 1, 5);
	m_layout->addWidget(m_testBtn, 1, 0, 1, 5);
	// 布局在界面上显示出来
	this->centralWidget()->setLayout(m_layout);	
	

	// 信号与槽的连接
	connect(this, &QtWidgetsApplication1::sign, this, &QtWidgetsApplication1::getBFlag);
	connect(m_testBtn, &QPushButton::clicked, this, &QtWidgetsApplication1::on_m_testBtn_clicked);
}


void QtWidgetsApplication1::on_m_testBtn_clicked() {
	bool bFlag = false;

	// 发射信号,触发槽函数(通过引用带回所需要的值)
	emit sign(bFlag);	
	
	if (bFlag) {
		m_titleLabel->setText("---通过引用拿到了返回值---");
	} else {
		m_titleLabel->setText("---没有拿到返回值---");
	}
}


// 信号触发的槽函数
void QtWidgetsApplication1::getBFlag(bool &bFlag) {
	// 通过引用返回需要的值
	bFlag = true;
}

main.cpp

#include "QtWidgetsApplication1.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtWidgetsApplication1 w;
    w.show();
    return a.exec();
}

总结:
这是我用qt搞五子棋小项目时发现的问题,然后请教了网上的一位大佬,得知可以使用C++特性引用类型得到槽函数的返回值,大佬还说:“指针和引用是C++重要的特性,以后项目中也很可能会大量用到!

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cpp_learners

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

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

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

打赏作者

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

抵扣说明:

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

余额充值