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++重要的特性,以后项目中也很可能会大量用到!

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
好的,我可以帮你解答这个问题。首先,我们需要使用Qt提供的QNetworkAccessManager类来发送网络请求。具体的函数实现如下: ```cpp void uploadFile(const QString& id, const QUrl& url, const QString& filePath) { QNetworkAccessManager manager; QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); // 设置参数 QHttpPart idPart; idPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"id\"")); idPart.setBody(id.toUtf8()); multiPart->append(idPart); // 添加文件 QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/zip")); filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"" + QFileInfo(filePath).fileName() + "\"")); QFile *file = new QFile(filePath); file->open(QIODevice::ReadOnly); filePart.setBodyDevice(file); file->setParent(multiPart); multiPart->append(filePart); // 发送请求 QNetworkRequest request(url); QNetworkReply *reply = manager.post(request, multiPart); multiPart->setParent(reply); // 处理返回值 QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); qDebug() << reply->readAll(); reply->deleteLater(); } ``` 上述代码中,我们首先创建了一个QNetworkAccessManager对象,然后创建了一个QHttpMultiPart对象,并设置了参数和要上传的文件。接着,我们构造了一个QNetworkRequest对象,并使用QNetworkAccessManager的post方法发送了请求。最后,我们通过信号和机制等待请求返回,并处理服务器返回值使用方法如下: ```cpp QString id = "12345"; QUrl url("http://example.com/upload"); QString filePath = "/path/to/your/zip/file.zip"; uploadFile(id, url, filePath); ``` 需要注意的是,如果要上传的文件比较大,可能会导致内存占用过高,因此你可以考虑使用QFileDevice的子类QBuffer来代替QFile,这样可以将文件内容读入内存中的缓冲区,再进行上传。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cpp_learners

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

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

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

打赏作者

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

抵扣说明:

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

余额充值