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

QT 信号槽返回值 一、方法 获取信号槽返回值的方法有三种: (1)通过形参的方式,传递引用或者指针。(未写例子) (2)直接在信号发出位置获取返回值。(下面有例子) (3)通过QMetaObject::invokeMethod方法。(具体使用可以参考QT的帮助文档或者看下面的代码实例) 二、代码 #ifndef WRITETHREAD_H #define WRITETHREAD_H #include <QObject> class WriteThread : public QObject { 阅读详情

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

【探究】信号槽到底能不能有返回值? 【较真】信号槽到底能不能有返回值? 前言 Qt信号槽到底可不可以有返回值呢?问了下身边的同事,有的人说可以,有的人说不可以。在实际项目中,确实没看到过有人使用带返回值的信号槽,可以说存在感很低。平时大家工作也比较忙,所以也没有时间去较真信号槽到底能不能有返回值。今天就一起带大家较真一下,看一看信号槽能否有返回值。如果可以有返回值,那么又有哪些限制导致大家都不用它呢? 提示:本文代码略多,但是都很简单,请耐心阅读。 上代码 新建一个Qt Widgets Application,在Qt为我们生成的主窗口.h文件 阅读详情

相关推荐

信号槽的返回值(QMetaObject::invokeMethod的用法)——Qt

概述 Qt元对象系统是Qt最核心的一个基础特性,元对象系统负责信号和插槽对象间通信机制、运行时类型信息和Qt属性系统。为应用程序中使用的每个QObject子类创建一个QMetaObject实例,此实例存储QObject子类的所有元信息。通过元对象系统,你可以查询QObject的某个派生类的类名、有哪些信号、槽、属性、可调用方法等信息,然后可以使用QMetaObject::invokeMethod()调用QObject的某个注册到元对象系统中的方法。而这里,主要就介绍改函数的使用方法,以及大致简介。

xiaopei_yan的博客 3341

Qt 信号槽返回值

1、定义线程间交互数据 #ifndef MESSAGE_H #define MESSAGE_H #include <QMetaType> #include <QVariant> struct Message{ QVariant data; }; Q_DECLARE_METATYPE(Message) #endif // MESSAGE_H 2、 业务类 #ifndef BUSINESS_H #define BUSINESS_H #include <QObject&g

amwha的专栏 2763

从PyCharm+Qt Designer切换到Qt Creator:我踩过的‘槽函数生成’坑与平滑迁移指南

本文详细介绍了从PyCharm+Qt Designer迁移到Qt Creator的开发经验,重点解析了槽函数生成、ui_xxx.h文件处理及.pro文件配置等关键问题。通过对比两种开发范式的差异,提供实用的迁移步骤和优化技巧,帮助开发者平滑过渡到Qt Creator环境,提升C++ Qt开发效率。

weixin_30902251的博客 502

Qt窗口间信号发送和槽函数返回值

新建工程,Qt Widgets Application,类名为Widget。 在这个基础上新建Qt设计师界面类,类名Dialog。 widget.ui和dialog.ui里分别拉入一个QPushbutton,widget.ui里再拉入一个QLineEdit,QLineEdit里随便填个数字。 想要获取槽函数的返回值,可以通过给信号加上参数的方式,参数是一个引用。 Dialog里点击按钮发送信号,并打出参数的值。参数的值根据widget.ui里QLineEdit的值变化。这个参数即相当于槽函数的返回值

陌上人如玉,公子世无双。 3305

Qt和c++面试集合

槽:槽函数其实就是普通的C++函数,可以是虚函数、static函数,可以被重载,可以被访问修饰符修饰,也可以被其他C++成员函数调用等,它唯一的特定就是可以和信号连接。事件过滤器类只需对当前安装的对象进行处理,无需关心其他操作,且一个事件过滤器类可以被多个对象使用,例如Qt文档中的按键过滤示例,KeyPressEater类中的eventFilter过滤了所有的键盘按下事件,只要安装此事件过滤器的控件,都接收不到键盘按键按下的事件,这种就是对某个通用的事件进行过滤,可以进行多次复用。否则返回false。

weixin_41199566的博客 2176

2026年华为od机试真题题库

OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)

面试高手的博客 19万+

Qt槽函数相当于C++的什么?

Qt槽函数本质上是C++的成员函数,但通过元对象系统扩展了动态调用、线程通信等能力。相比普通成员函数,槽函数支持信号绑定、跨线程事件队列和类型安全检查。与传统回调函数相比,槽函数通过信号槽机制实现更高层次的解耦,具备自动生命周期管理和线程安全特性。其底层依赖moc预处理器生成元数据,通过QMetaObject实现动态连接和事件派发。信号槽机制采用连接缓存和模板元编程优化性能,为Qt应用提供高效的事件驱动架构。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1410

详解账务核心,从入门到精通

本文系统阐述了账务体系的设计原理与实现方法,围绕支付交易的基础设施——账务系统展开深入探讨。文章首先从账务实现原理出发,强调从客户场景中抽象能力的重要性,详细解析了账务总架构及其与外围系统的协同关系。随后重点剖析了账户子系统的设计,包括账户生态、主体管理、结构设计等核心要素,并针对热点账户问题提出了多种创新解决方案。此外,文章还深入探讨了会计日切原理、营销类账务处理等专业领域,最后以支付机构场景为例,全面解析了清结算业务的账务实现模型。全文通过理论结合实践的方式,为构建高效、可靠的账务系统提供了系统性的方法

银行信息系统应用架构详解 531

Qt 信号槽原理 - 槽函数调用时机

通过阅读信号槽相关源码,了解信号槽机制,知道槽函数的调用时机

qq_62381297的博客 3410

YOLO11涨点优化:知识蒸馏 | 引入FGD(Focal and Global Distillation)蒸馏,让轻量学生模型汲取大模型全局感知力

文章摘要 目标检测模型YOLO11在轻量化部署中存在"全局盲区"问题,即轻量模型感受野不足导致大尺度场景下性能下降。知识蒸馏技术FGD(Focal and Global Distillation)通过双分支机制有效解决这一问题:Focal Distillation分离前景背景特征,让学生模型聚焦关键区域;Global Distillation传递像素间关系信息,弥补全局感知缺陷。实验表明,FGD可使YOLO11轻量版mAP提升2.5%以上,且不增加推理耗时。本文详细解析了FGD原理,并给出YOLO11上的实

2601_95807009的博客 226

AUTOSAR知识点 之 XCP (三):XCP功能描述

记录一下XCP使用时候的功能包含命令时序、错误码表、事件描述以及对规范的记录。XCP的图示如下从上图就可以看出数据流的流向CAN-CANIF-XCP,发送反之。XCP的状态机如下。

梦想技术家 3075

c++之QT

Qt入门(C++) 1.Qt的优势: 1.跨平台,几乎支持所有的平台 2.接口简单,容易上手,学习QT框架对学习其他框架有参考意义 3.一定程度上简化了内存回收机制 (特定场景下会帮助释放内存) 4.开发效率高,能够快速的构建应用程序。 5.可以进行嵌入式开发 2.展示一个窗口 #include <iostream> #include <QApplication> #inc...

hongge_smile的博客 1万+

C#里用HttpListener实现WEB API接口服务端

本文介绍了一个基于WinForm的HTTP服务实现方案。该方案使用HttpListener类创建了一个支持JSON POST请求处理的轻量级Web服务器,主要特点包括:1) 纯线程方式实现请求监听和处理;2) 提供标准化的JSON响应格式;3) 支持自定义请求处理逻辑;4) 包含完整的日志记录功能。代码示例展示了如何初始化服务、处理不同类型的请求(包括JSON POST),并提供了线程安全的UI更新机制。该实现适用于需要简单HTTP接口的Windows桌面应用程序,可作为程序间通信的基础设施。

大坡3D软件开发 228

QT基本使用及相关组件介绍(C++版)

​ Qt 是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。常见GUI:QT:支持多平台开发;支持css;面向对象特性体现突出;发展趋势良好。MFC:只能在windows开发;运行程序效率高;库的安全性好;public slots: // 添加槽函数private:// 重新更新// 设置 完成之后可以拉伸。

swpucwf的博客 1万+

SAP 生产订单工序删除状态撤回简介

2、我们在前台对于生产订单的状态一个是在生产订单抬头中的状态,另外一个是针对上面一直在测试的是工序的状态,这个两个状态是前台可见的状态,实际生产订单还有一个组件物料的状态,这个状态是不可见的一个状态。生产订单中的0010工序中对应的组件的栏位被标识,表示有物料分配到了0010的工序中,正常情况下0010的工序被分配了工序是不应该被删除的。将已领料的工序删除掉,导致异常的发生。当物料已领料会,用户仍然把已分配的物料的工序删除掉,导致后续业务操作过程中产生异常,如下图中所示,0010的工序被打上了删除标识。

我小时候很黑的博客 1940

Allegro如何去掉PCB内层未使用的过孔孔环?

在用Allegro进行PCB设计过程中,遇到铺铜铜箔被焊盘大量割断,导致铺铜不完整,这样就会导致铺铜过电流太小,影响板的性能,严重的会导致板工作不稳定,甚至不工作。解决办法:是去掉内层未使用的过孔孔环,增大过铜箔面积。

bhxc809751502的博客 2571

QT中使用Lambda表达式作为槽函数用法,以及捕获列表和参数列表用法与区别

本文介绍了Qt中Lambda表达式作为槽函数的高级用法,重点解析了捕获列表、参数列表对接、mutable关键字等核心概念。通过对比传统槽函数,展示了Lambda表达式在代码简化、上下文捕获方面的优势,并提供了实际应用示例。同时强调了生命周期管理等注意事项,帮助开发者正确高效地在Qt信号槽机制中使用Lambda表达式。

学无止尽,谨言慎行! 1468

五步教你用GPT-5画出国自然技术路线图!轻松节省80%画图时间(附AI提示词)

七哥给大家推荐的高校都在用的AI平台——高级学术版专业应用平台,集成了ChatGPT、Claude、Gemini、Grok等Al大模型的PLUS版本平台,包括 ChatGPT-5、4o、o3、4.1、4.5、Gemini 2.5 Pro、Claude 3.7、Claude 4、DeepSeek 满血版、Grok 3 、Grok 4等原生线路,还有国际主流的GPTs学术应用,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。

智能AI让学术科研更容易 1497

QT跨平台应用程序开发框架(3)—— 信号和槽

有时候Qt内置的信号和槽可能无法满足我们的需求,所以我们可以自己实现信号和槽,我们先说自定义槽我们上篇文章已经用自定义槽实现了按按钮切换按钮里的文本:所以所谓的槽函数,操作过程和自定义一个普通的成员函数没啥区别除了上面这种最基础的,还有第二种更便捷的方法先通过拖拽方式创建一个按钮,右键这个按钮,点击“转到槽”:可以看到,我们通过这种方式生成的槽函数,并没有通过connect关联,因为在 Qt 中,除了通过connect 之外,还可以通过函数名字的方式来自动连接比如上面的槽函数名字。

aaqq800520的博客 1468

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Qt 槽函数支持重载吗?】支持,附案例

本文详细解析Qt槽函数重载的语法、常见问题及最佳实践。核心内容包括:槽函数完全遵循C++重载规则,Qt4(字符串宏)和Qt5(函数指针)两种连接方式的差异,以及处理重载的三种方法(static_cast、QOverload和Lambda表达式)。重点分析了自动连接失效、类型转换失败等高频坑点,并给出解决方案。最佳实践推荐优先使用Qt5新式语法,在Qt5.7+中使用QOverload,简单逻辑采用Lambda表达式,新项目彻底放弃Qt4旧语法以确保类型安全和可维护性。

一起学习进步! 603

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【QT教程】QT6与C++17 QT与C++新特性

QT6与C++17的背景知识《QT6与C++17》书籍正文——QT6与C++17的背景知识QT6与C++17的背景知识概述1.1 QT6的背景QT是一个跨平台的C++图形用户界面应用程序框架,它被广泛应用于开发GUI应用程序,也可以用来开发非GUI程序,如控制台工具和服务器。QT被设计成能够在多种操作系统上运行,包括但不限于Windows、Mac OS X、Linux、iOS和Android。QT6是QT框架的第六个主要版本,于2020年发布。

QT性能优化QT原理源码QT界面美化 2887

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Qt】private槽函数可以被其他类中的信号连接

即使 B 类的槽函数是private的,A 类通过信号连接 B 类的槽函数也没有问题。Qt 的信号和槽机制通过元对象系统实现,不受 C++ 访问权限的限制。使用private槽函数可以提高代码的封装性和安全性。

-凌凌漆-的博客 824

Qt lambda 简化你的代码 connect 写法示例 省略槽函数定义

简述 lambda (来姆达啊) 很标准哈哈 英 /ˈlæmdə/ 美 /ˈlæmdə/ 百度百科 “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambdaabstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。...

我是唐 1020

信号与槽函数机制的三种体现

首先先了解一下什么是信号和槽函数机制? 信号和槽函数是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其他工具包的重要地方。信号和槽是 QT 自行定义的一种通信机制,它独立于标准的 C/C++ 语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,...

Tjmies的博客 1257

Qt-C++-QMetaObject-元数据类-存储Qt类的基本信息-槽函数逆向定位

从上面的源码可知,如果需要真正的逆向定位槽函数,关键在于找到qt_static_metacall函数,找到qt_meta_stringdata_QtConnect所在位置可知槽函数的源码名称。qt_static_metacall函数是当前类对象槽函数的上级函数,可以根据此特征,在一些有提示的按钮上,快速找到此函数。在qt_meta_stringdata_QtConnect 这个变量中,保存了槽函数调用名称,在qt_meta_data_QtConnect中有调用函数的序号索引。如有疑问,敬请留言。

插件开发 1163

我将详细介绍 C++ 中的引用(Reference),包括其定义、特性、使用场景、与指针的区别、以及在函数参数、返回值中的应用

我将详细介绍 C++ 中的引用(Reference),包括其定义、特性、使用场景、与指针的区别、以及在函数参数、返回值中的应用。结合前文的调试工具场景(串口和 Modbus TCP 通信),我将提供一个详细的 Demo 项目,使用 Qt Creator 实现一个多设备调试工具,展示引用在数据管理、GUI 更新、和数据库交互中的实际应用。项目将扩展前文的结构体功能,使用引用优化数据传递,支持多设备(串口和 Modbus TCP),并集成 QtSql(SQLite)、QtNetwork、和 QtCharts。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 780
上一篇: Qt 自定义槽函数被执行两次
下一篇: Qt 使用QMediaPlayer类在VS中播放音乐
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

cpp_learners

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

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

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

打赏作者

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

抵扣说明:

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

余额充值