QT信号与槽中,槽函数是可以定义有返回值的,但是我们都是在connect函数中进行调用,那么该如何获得调用后的槽函数的返回值呢?
答案是不可能获得了的!
槽函数虽然可以定义返回值类型,但其实他和信号一样是不支持有返回值类型的,即使你定义了,也是没有用处的,所以我们在定义信号和槽函数时一般都是使用void类型进行修饰。
信号和槽函数都可以带参数.
所以,想要获得槽函数里的计算的结果,就得使用到引用类型。
具体操作如下:
-
定义信号,信号中添加引用类型的参数参数;
signals: void sign(bool &bFlag);
-
定义槽函数,槽函数中必须有和信号一致的引用类型的参数;
private slots: void getBFlag(bool &bFlag);
-
将信号与槽进行连接;
connect(this, &QtWidgetsApplication1::sign, this, &QtWidgetsApplication1::getBFlag);
-
实现槽函;
void QtWidgetsApplication1::getBFlag(bool &bFlag) { // 通过引用返回需要的值 bFlag = true; }
-
使用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++重要的特性,以后项目中也很可能会大量用到!”