news 2026/5/1 11:40:24

Qt------信号槽,属性,对象树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt------信号槽,属性,对象树

目录

  • 1,信号槽
    • 1.1,槽函数执行顺序
    • 1.2,获取信号发出者
    • 1.3,断开连接
    • 1.4,QSignalMapper 用法

1,信号槽

1.1,槽函数执行顺序

1,槽函数执行顺序

connect(this,SIGNAL(downloadFile()),this,SLOT(onDownloadFile())); emit downloadFile(); renameFile();

看上述代码,现在有这样的一个问题,当我用 emit 发出信号后,我是执行完槽函数之后再执行renameFile函数呢,还是发出信号后立即就执行renameFile函数呢?
答案是会先执行完槽函数之后,再执行后面的函数,并不是两者并发执行。

2,信号与多个槽同时连接,槽函数的执行顺序

connect(this,SIGNAL(downloadFile()),this,SLOT(onDownloadFile2())); connect(this,SIGNAL(downloadFile()),this,SLOT(onDownloadFile3())); connect(this,SIGNAL(downloadFile()),this,SLOT(onDownloadFile1())); emit downloadFile();

当一个信号和多个槽函数连接之后,执行顺序是什么样的呢?
上述代码的执行顺序为 onDownloadFile2() , onDownloadFile3() , onDownloadFile1()。
所以当一个信号连接多个槽函数时,执行顺序就是connect的顺序

1.2,获取信号发出者

在槽函数中 利用sender() 可以获取信号发出者。

void Widget::on_pushButton_clicked() { QPushButton* btn = dynamic_cast<QPushButton*>(sender()); qDebug()<<btn->text(); }

1.3,断开连接

disconnect();
在 Qt 中,disconnect函数用于断开信号与槽之间的连接,以阻止信号发射时调用相应的槽函数。disconnect函数有多种重载形式,以下是常见的使用方式:
1. 断开特定对象的特定信号与特定槽的连接
cpp

// 假设我们有两个对象,senderObject发送信号,receiverObject接收信号并执行槽函数 QObject *senderObject = new QObject(); QObject *receiverObject = new QObject(); // 连接信号与槽 QObject::connect(senderObject, &QObject::destroyed, receiverObject, [&]() { qDebug() << "senderObject 被销毁,receiverObject 接收到信号"; }); // 断开连接 QObject::disconnect(senderObject, &QObject::destroyed, receiverObject, [&]() { qDebug() << "senderObject 被销毁,receiverObject 接收到信号"; });

在这个例子中,QObject::connect建立了senderObject的destroyed信号与receiverObject的一个匿名槽函数的连接。之后,QObject::disconnect使用相同的参数断开了这个连接。这样,当senderObject被销毁时,匿名槽函数将不再被调用。

2. 断开一个对象的所有信号与另一个对象的所有槽的连接
cpp

QObject *sender = new QObject(); QObject *receiver = new QObject(); // 建立多个连接(这里假设已经建立了多个信号槽连接) // 断开 sender 的所有信号与 receiver 的所有槽的连接 QObject::disconnect(sender, nullptr, receiver, nullptr);

在这个重载形式中,sender的所有信号与receiver的所有槽之间的连接都会被断开。
3. 断开一个对象的特定信号与所有连接的槽的连接
cpp

QObject *object = new QObject(); // 连接信号与多个槽(假设已经建立了多个连接) // 断开 object 的 destroyed 信号与所有连接的槽的连接 QObject::disconnect(object, &QObject::destroyed, nullptr, nullptr);

这里使用nullptr作为接收者和槽函数的参数,表示断开object的destroyed信号与所有连接的槽的连接。

4. 断开一个对象的所有连接

QObject *object = new QObject(); // 连接信号与多个槽(假设已经建立了多个连接) // 断开 object 的 destroyed 信号与所有连接的槽的连接 QObject::disconnect(object, nullptr, nullptr, nullptr);

1.4,QSignalMapper 用法

QSignalMapper 是一种map容器,它的主要作用是能够建立一个对象的映射关系,这个对象是用来发送信号的对象,

void setMapping(QObject *sender, int id);此函数用来建立映射关系。

QSignalMapper 是 Qt 框架中的一个类,它允许将一个信号映射到另一个信号,并可以在映射过程中传递不同的数据。它常用于将多个具有相同信号的对象连接到同一个槽函数,但希望根据发送信号的对象或其他参数执行不同的操作。

QSignalMapper *signalMapper = new QSignalMapper(this); signalMapper->setMapping(ui->btn1,1); signalMapper->setMapping(ui->btn2,2); signalMapper->setMapping(ui->btn3,3); connect(ui->btn1,&QPushButton::clicked,signalMapper,static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map)); connect(ui->btn2,&QPushButton::clicked,signalMapper,static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map)); connect(ui->btn3,&QPushButton::clicked,signalMapper,static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map)); connect(signalMapper,&QSignalMapper::mappedInt,this,&Widget::dealPushbuttons);
void Widget::dealPushbuttons(const int& btnid) { if(btnid == 1) { qDebug()<<"btn1"; } else if(btnid == 2) { qDebug()<<"btn2"; } else if(btnid == 3) { qDebug()<<"btn3"; } }

如上图所示代码,btn按钮的clicked信号与 QSignalMapper 的map()槽函数连接。
map()槽函数会发送 mapped信号。

将mapped信号与我们自定义的槽函数相互连接,然后最终我们自定义的槽函数就能获取map中的key对应的value值,来判断是哪个对象发出的信号,然后做出相应操作。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 8:51:41

qView:极简高效的跨平台图片查看器终极指南

qView&#xff1a;极简高效的跨平台图片查看器终极指南 【免费下载链接】qView Practical and minimal image viewer 项目地址: https://gitcode.com/gh_mirrors/qv/qView 在数字时代&#xff0c;快速浏览图片已成为日常需求。qView作为一款实用的极简图像查看器&#x…

作者头像 李华
网站建设 2026/4/30 11:49:04

深度学习评估指标:

一.混淆矩阵&#xff0c;准确率&#xff0c;精确率&#xff0c;召回率&#xff0c;F1 【小萌五分钟】机器学习 | 混淆矩阵 Confusion Matrix_哔哩哔哩_bilibili 混淆矩阵&#xff1a; 二分类&#xff1a; 多分类&#xff1a; 得到混淆矩阵以后&#xff0c;我们可以根据混淆矩…

作者头像 李华
网站建设 2026/5/1 0:14:01

17、处理器早期估计建模:技术解析与应用实践

处理器早期估计建模:技术解析与应用实践 随着电子设备的不断小型化,我们正面临着越来越严峻的功率预算和功率密度限制。传统的处理器设计方式在满足高性能需求的同时,也带来了高能耗、散热困难等问题。因此,如何在设计初期准确估计处理器架构的性能,并进行优化以满足设计…

作者头像 李华
网站建设 2026/5/1 7:35:10

K12教育获客:3个GEO优化案例让课程转化率提升200%

在流量成本持续攀升的2025年&#xff0c;教育行业平均获客成本已突破3000元大关。据《2025年中国GEO行业发展报告》显示&#xff0c;采用智能推荐技术的教育机构&#xff0c;其课程咨询转化率比传统投放方式高出2.8倍。本文将深度解析GEO技术如何重构K12教育营销链路。一、教育…

作者头像 李华
网站建设 2026/5/1 7:22:13

基于Java的springboot/SSM+vue.js+uniapp小程序的蔬菜溯源系统小程序附带文章源码部署视频讲解等

文章目录前言详细视频演示具体实现截图后端框架SpringBoot前端框架Vue持久层框架MyBaits为什么选择我代码参考数据库参考测试用例参考源码获取前言 &#x1f31e;博主介绍&#xff1a;✌CSDN特邀作者、资深全栈开发程序员&#xff0c;曾在互联网大厂担任高级职位、码云/掘金/华…

作者头像 李华
网站建设 2026/4/26 17:36:07

终极Python进度条自定义动画完全指南

终极Python进度条自定义动画完全指南 【免费下载链接】alive-progress A new kind of Progress Bar, with real-time throughput, ETA, and very cool animations! 项目地址: https://gitcode.com/gh_mirrors/al/alive-progress 想要为你的Python项目打造专业级的动态进…

作者头像 李华