(四十三)信号与槽再探

Qt跨线程信号槽槽函数无响应(未调用)问题 最近在开发中遇到一个很奇怪的问题 ,槽函数与信号连接后,在代码执行中发出信号,槽函数始终进不去。一开始认为是connect调用传参不对,打了下返回值是true,而且在输出中也没有相关warnning输出。再一看跨线程信号槽调用,所以猜测跟多线程有关。排查过程中各种换信号、改参数都没有效果,偶然间把接收对象的创建移至主线程,槽函数居然执行成功了。本着有问题看手册的原则,在手册中找到了如下的说明: 大体意识是说:Qobject对象是有线程归属的,或者说其存活在特定线程中。当接收到队列连接的信或 投递的事件,槽 阅读详情

一个事实:

在实际的项目开发中,大多数时候是直接将组件中预定义信号连接到槽函数

 

Qt中信号(Signal)

信号只是一个特殊的成员函数声明

1.        函数的返回值是void类型

2.        函数只能声明不能定义

 

信号必须使用signals关键字进行声明

1.        函数的访问属性自动被设置为protected

2.        只能通过emit关键字发送信号

 

示例:

class Test : public QObject       //必须继承自QObject
{
   Q_OBJECT                           //必须在私有区声明Q_OBJECT宏
 
signals:                                         //使用signals声明信号函数
   void testSignal(int v);       //信号只能声明不能定义
 
public:
   void send(int i)
    {
       emit testSignal(i);    //使用关键字emit发送信号
    }
};

 

信号与槽的对应关系

一个信号可以连接到多个槽(一对多)

多个信号可以连接到一个槽(多对一)

一个信号可以连接到另一个信号(转嫁)

连接可以被disconnect()函数删除(移除)

 

其他几个注意点:

信号类只能在头文件中声明

信号与槽原型应该完全相同

不相同时,如果信号的参数多于槽参数,多于的参数将被忽略

槽函数的返回值必须是void类型

槽函数可以像普通成员函数一样被调用

信号与槽的访问属性多于connect() / disconnect()无效

 

信号与槽的意义

最大限度的弱化了类之间的耦合关系,提高了类的可复用性        

再设计阶段,可以减少不必要的接口类(抽象类)

在开发阶段,对象间的交互通过信号与槽动态绑定

 

 //TestSignal.h

#ifndef TESTSIGNAL_H
#define TESTSIGNAL_H

#include <QObject>

class TestSignal : public QObject
{
    Q_OBJECT

public:
    void send(int i)
    {
        emit testSignal(i);	//发送信号
    }
    
signals:	
    void testSignal(int v);	//信号声明
    
};

#endif // TESTSIGNAL_H

//RxClass.h

#ifndef RXCLASS_H
#define RXCLASS_H

#include <QObject>
#include <QDebug>

class RxClass : public QObject
{
    Q_OBJECT
public:

    
protected slots:
    void mySlot(int v)	
    {
        qDebug() << "void mySlot(int v)";
        qDebug() << "Sender: " << sender()->objectName();	
        qDebug() << "Receiver: " << this->objectName();		
        qDebug() << "Value: " << v;
        qDebug() << endl;
    }
};

#endif // RXCLASS_H

//main.cpp

#include <QtCore/QCoreApplication>
#include <QDebug>
#include "TestSignal.h"
#include "RxClass.h"

void emit_signal()
{
    qDebug() << "emit_signal()" << endl;

    TestSignal t;
    RxClass r;

    t.setObjectName("t");	
    r.setObjectName("r");

    QObject::connect(&t, SIGNAL(testSignal(int)), &r, SLOT(mySlot(int)));

    for(int i=0; i<3; i++)
    {
        t.send(i); 	
    }
}

void one_to_multi()
{
    qDebug() << "one_to_multi()" << endl;

    TestSignal t;
    RxClass r1;
    RxClass r2;

    t.setObjectName("t");
    r1.setObjectName("r1");
    r2.setObjectName("r2");

    QObject::connect(&t, SIGNAL(testSignal(int)), &r1, SLOT(mySlot(int)));
    QObject::connect(&t, SIGNAL(testSignal(int)), &r2, SLOT(mySlot(int)));		//一对多

    t.send(100);
}

void multi_to_one()
{
    qDebug() << "multi_to_one()" << endl;

    TestSignal t1;
    TestSignal t2;
    RxClass r;

    t1.setObjectName("t1");
    t2.setObjectName("t2");
    r.setObjectName("r");

    QObject::connect(&t1, SIGNAL(testSignal(int)), &r, SLOT(mySlot(int)));
    QObject::connect(&t2, SIGNAL(testSignal(int)), &r, SLOT(mySlot(int)));		//多对一

    t1.send(101);
    t2.send(102);
}

void signal_to_signal()
{
    qDebug() << "signal_to_signal()" << endl;

    TestSignal t1;
    TestSignal t2;
    RxClass r;

    t1.setObjectName("t1");
    t2.setObjectName("t2");
    r.setObjectName("r");

    QObject::connect(&t1, SIGNAL(testSignal(int)), &t2, SIGNAL(testSignal(int)));	//信号转嫁
    QObject::connect(&t2, SIGNAL(testSignal(int)), &r, SLOT(mySlot(int)));

    t1.send(101);	//t1间接发送信号	间接多对一
    t2.send(102);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // emit_signal();
    // one_to_multi();
    // multi_to_one();
    // signal_to_signal();
    
    return a.exec();
}


 声明:
此文根据 狄泰学院唐老师的《QT实验分析教程》创作

从基础到实践(四十三):TDDI芯片 TDDI芯片通过高度集成与车规级优化,成为智能座舱显示系统的核心引擎。其设计需在抗干扰能力(EMC)、环境鲁棒性(温度/振动)、光学性能三者间取得平衡。随着车载屏幕向OLED/Mini-LED演进,下一代TDDI将集成AI触控预测、局部刷新率切换等关键技术,持续推动驾乘体验革新。 阅读详情

相关推荐

《道德经》第四十三章

道德经》第四十三章是《道德经》中篇幅最短但意蕴极深的一章,它通过“无有入无间”的深刻比喻,再次强调了“柔弱胜刚强”的哲理,并点出了“无为”的益处。

SmallBull的博客 925

QT emit connect 无效的一种错误

connect方法的一般形式为: connect(*sender, SIGNAL(signal()), *receiver, SLOT(method())); 需要注意的是sender是实例化的一个对象,connect绑定的是该对象的signal()信号,如果存在同类型的其他实例化对象,他们的signal()信号是没有被绑定的例如存在sender0, sender1 仅调用 conn

windroid.xyz 6536

易灵思FPGA-软件Efinity和Modelsim联仿设置

文章目录前言一、modelsim破解过程二、使用步骤1.引入库2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智

qq_35221855的博客 5362

信号槽关联后没有反应、emit,全局变量,字符串拼接,中文乱码

信号槽关联后没有反应 第一 先看信号槽的每个字符是否正确 第二看信号槽声明是否写到正确位置 第三看信号槽的参数是不是正确的 自定义信号可以用emit来发送 如果信号槽不能带你想要的参数可以声明一个全局变量来使他们关联调用 全局变量一般在前面加m_来方便确认 声明出来的变量与指针最好第一时间给他们赋初值 QString xihuan = “”; 指针用NULL; 字符串拼接 一定要细心,用+来连接 ...

weixin_45955823的博客 845

【数学建模】 进化计算与群体智能

遗传算法(GA)是一种用于优化和搜索问题的启发式算法。它模拟了自然选择的过程,其中个体通过遗传和变异进行繁殖,逐渐进化出更优的解。基本步骤初始化:生成初始种群。适应度评估:评估种群中每个个体的适应度。选择:根据适应度选择个体进行繁殖。交叉:选定个体对进行基因交换,生成新的后代。变异:对一些个体进行基因变异,以增加多样性。迭代:重复评估和繁殖过程,直至达到停止条件。粒子群优化算法(PSO)是一种基于群体智能的优化算法,由Kennedy和Eberhart于1995年提出。其灵感来源于鸟群觅食的行为。

weixin_42914989的博客 1113

避开这些坑!SOEM控制伺服电机时PDO配置与状态机处理的常见误区

本文深入探讨了使用SOEM控制伺服电机时PDO配置与状态机处理的常见误区,提供了详细的避坑指南。从SyncManager配置顺序到状态字位掩码应用,再到网络同步优化,帮助开发者避免通信失败和系统不稳定问题,提升工业自动化项目的可靠性。

chongtai6075的博客 482

qt信号槽不响应问题

今天遇到emit信号后,槽一直没有响应 我的信号定义是void recv(std::string)槽跟他一样,接收数据,connect检查,qthread qobject都检查没有问题,但就是槽没有响应 分析得到: 信号槽传递的参数需要是常规的,所以我将信号和槽定义为void recv(QString),然后消息正常接收,记录一下这个低级错误

dadaniugege的博客 1175

Thompson Sampling vs UCB:5个真实业务场景下的算法选型指南

本文深入对比了Thompson Sampling与UCB算法在电商推荐、在线广告、医疗试验、金融定价和游戏调整五大真实业务场景下的表现。通过量化指标分析,为技术决策者提供了清晰的选型指南:Thompson Sampling凭借其概率匹配和贝叶斯框架,在需要快速收敛、处理冷启动及复杂约束的场景中通常更具优势;而UCB则在要求确定性、可解释性和理论保证的场景下表现更佳。

weixin_29181861的博客 153

Qt信号接收不到

问题:emit signal; 语句执行后,相应的对象控件接收不到信号。 方法:创建了多个对象,一个对象发送信号,但是另一个不同的控件接收不到。

qbw_csdn的博客 2743

基于Python的Booking酒店数据爬虫实战:最新技术与完整代码解析

本文将详细介绍如何使用Python构建一个高效的Booking酒店数据爬虫,涵盖从基础爬取到高级反反爬技术的完整实现。我们将使用最新的Python爬虫技术栈,包括requests-html、Playwright、智能代理轮换等技术,并提供完整的可运行代码示例。文章将深入探讨爬虫的各个组成部分,包括数据提取、存储、反反爬策略以及性能优化等方面。关键词:Python爬虫、Booking数据采集、反反爬技术、Playwright、数据存储。

2201_76125261的博客 936

ABAP Bits and Bytes 完全参考,理解内存、字节、位运算与类型解释

ABAP开发中业务代码与底层字节处理的差异:业务层关注采购订单、会计凭证等语义信息,而接口开发需处理十六进制、位运算等底层操作。文章通过整数变量示例说明同一段字节在不同类型解释下会呈现不同值,并介绍x类型、位运算及类型转换的实际应用。这些知识在文件接口、加密传输等场景中尤为重要,开发者需注意字节序、编码等问题。建议将底层协议处理与业务逻辑分离,以保持代码清晰和可维护性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 142

Re:Linux系统篇(四十三)信号篇·一:谁在敲进程的门?一篇带你了解信号概念与产生机制

本文从感性认识出发,系统梳理Linux信号的基本概念、查看方式及核心结论,并围绕信号的产生展开详细探讨。内容涵盖键盘操作触发信号、进程前后台切换对信号响应的影响、信号发送的本质与前台进程组机制,以及kill、raise、abort等系统调用与命令生成信号的具体方式,帮助读者全面理解信号在进程管理与通信中的关键作用。

小此方的博客 895

HFSS实战项目——GPS北斗双模微带天线

本文设计了一款方形圆极化微带天线应用于北斗B1和GPSL1频段,满足高增益、低VSWR、适当方向图等要求。设计中心频率为1568MHz,介质板采用厚度h=1.6mm的Arlon AD450(tm)板,相对介电常数为4.5,采用探针馈电。

2401_87464239的博客 1768

四十三、Linux 线程——线程同步之线程信号量

43.1 信号量 43.1.1 信号量介绍 信号量从本质上是一个非负整数计数器,是共享资源的数目,通常被用来控制对共享资源的访问 信号量可以实现线程的同步和互斥 通过 sem_post() 和 sem_wait() 函数对信号量进行加减操作从而解决线程的同步和互斥 信号量数据类型:sem_t 43.1.2 信号量创建和销毁 1 #include <sema...

dongbipi3785的博客 186

数据库常见面试题(附答案)

1.事务四大特性 原子性,要么执行,要么不执行 隔离性,所有操作全部执行完以前,其它会话不能看到过程 一致性,事务前后,数据总额一致 持久性,一旦事务提交,对数据的改变就是永久的 2.数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别 脏读:事务B读取事务A还没有提交的数据 不可重复读:两次事务读的数据不一致 幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看...

csdn问鼎 46万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

DeepSeek解读道德经 第四十三章

本章揭示:​终极力量是能让刚性系统自愿改变作用方向的柔性势能。​生物印证​:章鱼腕足无骨骼(至柔),却能撬开贝壳(至坚),力量达自重40倍;​商业铁律​:字节跳动用推荐算法(无形)重构全球内容分发权力(有形);​未来密钥​:在元宇宙构建中,谁先掌握虚拟物质柔性变形算法,谁将定义数字世界的物理法则。终极检验:当你的竞争对手开始模仿你的刚性外壳却不断遭遇系统崩溃时,证明你已构建起不可复制的柔性内核。

caleb的博客 798

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java进阶(四十三)线程与进程的区别_java 线程与进程的区别

线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。因此,主要作为进程之间及同一种进程的不同线程之间的同步和互斥手段。信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

2401_89317322的博客 940

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java进阶(四十三)线程与进程的区别

Java进阶(四十三)线程与进程的区别1、线程的基本概念  概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。   好处: (1)易于调度。 (2)提高并发性。通过线程可方

IT全栈 华强工作室 5万+

北斗三号频点_中国北斗三号与GPS公用频点的实时信号接收方法与流程

本发明涉及导航定位的信号接收技术领域,尤其涉及中国北斗三号与GPS公用频点的实时信号接收方法。背景技术:北斗三号卫星导航系统空间段由27颗中地球轨道卫星、5颗同步轨道卫星、3颗倾斜同步轨道卫星组成,提供两种服务方式,即开放服务和授权服务。开放服务是在服务区中免费提供定位、测速和授时服务,定位精度为10米,授时精度为50纳秒,测速精度0.2米/秒;授权服务是向授权用户提供更安全的定位、测速、授时和通...

weixin_39906130的博客 1288

[大师C语言(第三十六篇)]C语言信号处理:深入解析与实战

本文详细介绍了C语言信号处理的技术和方法,包括信号的基本概念、处理方式、信号集的使用以及多进程环境中的信号处理。通过这些信息,开发者可以更好地理解信号处理的工作原理,并在C语言程序中有效地使用信号。信号处理是操作系统中一个重要的概念,对于理解进程间通信和系统级编程至关重要。希望本文能够作为你在信号处理道路上的一个有用的指南。

极客代码 1539

复习嵌入式的第四十三天——ARM——I2C

在两个芯片链接的对应引脚上,当一方输出高电平时,则实际的电平高低由另一方决定。

KF20041021的博客 561

元初混沌 6G 全域通感一体化体系架构 第一卷四阶第四十三篇 火(信号激励)振荡增益演化规律

第四十三篇 火(信号激励)振荡增益演化规律。

A875874876的博客 130

java 线程进程区别_Java进阶(四十三)线程与进程的区别

#Java进阶(四十三)线程与进程的区别##1、线程的基本概念概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。好处:(1)易于调度。(2)提高并发性。通过线程可方便有效地...

weixin_29783347的博客 134

(四十三)线程——线程同步(互斥锁、读写锁、条件变量、信号量)

一、引入  当我们有多个线程一起工作时,就要注意一些问题,就好像小组合作的时候要注意组员之间的关系一样,多个线程同时访问共享数据时可能会冲突,这跟前面讲信号时所说的可重入性是同样的问题。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成:   1、从内存读变量值到寄存器   2、寄存器的值加1   3、将寄存器的值写回内存   假设两个线程在多处理器平台上同时执行这三条指

FadeFarAway的博客 5366
上一篇: (二)算法相关概念
下一篇: Qt学习笔记-----Model/View架构之自定义Model
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值