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

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

  1. python函数的返回值是返回引用吗_python-函数(上):函数返回值、函数调用、前向引用...

    编程方法: 1.面向对象:类--class 2.面向过程:过程--def 3.函数式编程:函数--def #python中函数#函数的定义#打印一个佛祖镇楼 -> 一个功能点的解释 defpri ...

  2. C++_引用做函数的返回值_引用的本质---C++语言工作笔记032

    然后我们再去看,要注意不要反悔局部变量的引用什么意思? 比如这里我有个方法,test01,他返回了一个int a =10; 这个变量的引用,而a这个变量是个局部变量. 这个时候我们去用一个引用,接收这 ...

  3. 引用之函数返回值 函数的返回值为引用类型《三》

    一: 可以把函数定义为引用类型,这时函数的返回值即为某一变量的引用(别名),因此,它相当于返回了一个变量,所以可对其返回 值进行赋值操作.这一点类同于函数的返回值为指针类型. 由于函数调用返回的引用类 ...

  4. 引用作为函数的返回值

    引用作为函数的返回值--原版 1.引用作为函数的返回值时,必须在定义函数时在函数名前将& 2.用引用作函数的返回值,的最大的好处是在内存中不产生返回值的副本 float temp; float ...

  5. C/C++ 引用作为函数的返回值

    语法:类型 &函数名(形参列表){ 函数体 } 特别注意: 1.引用作为函数的返回值时,必须在定义函数时在函数名前将& 2.用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 ...

  6. 在c语言中怎么返回引用参数,C语言函数 函数的声明 C语言的头文件 #include的用法 形参和实参 函数的返回值 - 猫扑天空...

    C语言函数 一.是什么? 是指编程中对一块功能代码的封装,可以理解一个程序片段 二.有什么用? 可以封装代码,方便调用,提高复用性 三.怎么用? 定义:  返回值类型  函数名(形参类型 参数名1-. ...

  7. Python基础第六天——函数的使用、函数的参数、函数的返回值、函数的嵌套、命名空间、作用域、函数对象...

    一.拾遗 1.通常情况下无参函数只是进行操作,所以不需要返回值:有参数函数则需要返回值. 2.练习: 判断用户输入一串字符,如果这串字符的长度小于5则重新输入,如果大于5则退出循环. while Tr ...

  8. JavaScript基础08-day10【函数的返回值、实参、立即执行函数、方法、全局作用域、函数作用域、提前声明、this、工厂方法创建对象、构造函数】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

  9. python中函数的返回值_python--函数的返回值、函数的参数

    函数的返回值 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 函数名:命名规则和变量一样 函数的返回值: return, 函数执行完毕. 不会执行后面逻辑 如果函数中不写return返回No ...

最新文章

  1. SSD情何以堪!微软:扔掉你的旧PC换台新的
  2. 使用NetFlow分析网络异常流量
  3. Gradle7.0,依赖统一管理的全新方式,了解一下~
  4. seq2seq和Transformer
  5. Xcode9学习笔记69 - 创建各种类型的文件(文本、数组、字典、图片)
  6. Python基础——数据分析考核(基础版本)
  7. Mysql命令行修改字段类型
  8. JavaScript之apply()和call()的区别
  9. rto净化效率计算公式_全面剖析 石油化工行业RTO蓄热式焚烧炉的优势要素
  10. 读取Mc1000的 唯一 ID 机器号
  11. [排错] Status error 2850
  12. C++-Qt【1】-退出程序静态调试
  13. android5.1 xposed,Xposed框架oppo下载
  14. macOS 终端打开提示:zsh compinit: insecure directories
  15. 树莓派中的 IM 私有云支持多少并发?
  16. 在VS中如何设置自动换行
  17. 将腾讯视频QLV格式转换为MP4格式
  18. 【一神】10.15系统 oc引导 amd黑苹果 cpu识别错误/未知
  19. QTableView点击表格内空白行的信号
  20. Python大疆相片/航片/照片的内容信息获取:以m300为例JPG

热门文章

  1. LeetCode小白菜笔记[3]:Palindrome Number
  2. 线上活动的17个主题 你用过几个?
  3. 麦昆PLUS V2-适合中小学STEAM教学的机器人套件
  4. JS中的 setTimeout 和 clearTimeout
  5. MathType6.5公式编辑器的使用
  6. Linux下文件夹的自动同步
  7. 挺有用的清除缓存bat脚本
  8. 惠普HP OfficeJet 5110 一体机驱动
  9. 计算金球铁球体积c语言,网球金球制规则
  10. 【甄选靶场】Vulnhub百个项目渗透——项目三:Raven-2(服务利用,udf提权)