信号与槽的总结

QT中的信号与Linux的信号对比

1)信号源

2)信号的类型

3)信号的处理方式

QT信号与Linux信号的深度对比分析

一、信号源对比

QT信号

  • 用户定义信号

    :由开发者通过

    signals:
    

    关键字在QObject派生类中显式声明

    class MyObject : public QObject {Q_OBJECT
    signals:void mySignal(int param);
    };
    
  • 框架内置信号:QT框架提供的信号(如QPushButton的clicked())

  • 信号触发方式

    :通过

    emit
    

    关键字显式触发

    emit mySignal(42);
    

Linux系统信号

  • 系统预定义信号:由操作系统内核预先定义(如SIGINT、SIGSEGV等)

  • 硬件产生信号:如SIGSEGV(内存访问错误)、SIGFPE(算术异常)

  • 进程间信号

    :通过kill()系统调用发送

    kill(pid, SIGTERM);
    

二、信号类型对比

QT信号类型特征

特性说明
类型安全编译时检查参数类型匹配
带参数可携带任意数量、类型的参数
面向对象必须属于某个QObject派生类
同步/异步默认队列连接(异步),可设置为直接连接(同步)

Linux信号类型特征

特性说明
固定编号标准信号编号1-31,实时信号34-64
无参数仅信号编号,不能携带额外数据
进程级别与特定线程/进程关联,非面向对象
同步触发信号处理函数在信号产生时立即执行

常见Linux信号示例:

SIGINT (2):终端中断信号(Ctrl+C)

SIGKILL (9):强制终止信号

SIGSEGV (11):无效内存访问

SIGTERM (15):终止请求信号

三、处理方式对比

QT信号处理(信号-槽机制)

// 连接方式
QObject::connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);// 槽函数声明
public slots:void updateValue(int newValue);**处理特点**:
  1. 多线程安全:自动跨线程事件队列传递
  2. 连接类型:
    • 直接连接(同步执行)
    • 队列连接(异步,接收者线程事件循环处理)
    • 自动连接(默认,根据线程关系自动选择)
  3. 内存管理:自动处理对象生命周期(可使用Qt::UniqueConnection)

Linux信号处理

// 信号处理函数注册
struct sigaction sa;
sa.sa_handler = handler;
sigaction(SIGINT, &sa, NULL);void handler(int sig) {// 信号处理逻辑
}

处理特点

  1. 同步执行:中断当前执行流立即处理
  2. 限制严格:
    • 信号处理函数中只能调用异步信号安全函数
    • 不能使用malloc等非可重入函数
  3. 特殊处理:
    • SIGKILL和SIGSTOP不能被捕获或忽略
    • 某些信号会导致核心转储(如SIGSEGV)

四、关键差异总结

对比维度QT信号Linux信号
抽象级别高层次面向对象机制低层次操作系统机制
参数传递支持复杂参数传递仅信号编号,无参数
线程处理自动处理跨线程通信需要显式处理线程掩码
可靠性可靠,不会丢失非实时信号可能丢失
处理时机通过事件循环异步处理立即中断当前执行流
调试支持可通过QtCreator调试需要gdb等系统级调试工具

五、实际应用场景

QT信号典型用例

  1. GUI事件处理(按钮点击、窗口关闭)
  2. 跨线程通信(工作线程到主线程通知)
  3. 模块间解耦(观察者模式实现)

Linux信号典型用例

  1. 进程控制(优雅终止服务进程)
  2. 异常处理(内存错误、算术异常捕获)
  3. 进程间简单通知(无需复杂数据传递)

六、高级主题

QT信号的高级特性

  1. Lambda表达式连接:

    connect(button, &QPushButton::clicked, [=](){qDebug() << "Button clicked";
    });
    
  2. 信号转发:

    connect(obj1, &ClassA::signalA, obj2, &ClassB::signalB);
    
  3. 信号连接管理disconnect()断开连接

Linux信号的进阶处理

  1. 信号屏蔽:

    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    pthread_sigmask(SIG_BLOCK, &set, NULL);
    
  2. 实时信号处理:

    union sigval value;
    value.sival_int = 42;
    sigqueue(pid, SIGRTMIN, value); // 可携带少量数据
    
  3. 替代方案:更复杂的进程通信建议使用socket、管道等机制

信号槽中connect函数的使用

connect (const QObject *sender, const char * signal ,const QObject * receiver , const char * method , Qt::ConnectionType type = Qt::AutoConnection )

参数说明:

• sender:信号的发送者;

• signal:发送的信号(信号函数);

• receiver:信号的接收者;

• method:接收信号的槽函数;

• type: ⽤于指定关联⽅式,默认的关联⽅式为 Qt::AutoConnection,通常不需要⼿动设定。

在控件的问题上我们需要查阅的问题

内置了哪些信号,信号是何时触发的

内置了哪些槽,槽的作用是什么

一、常见控件的内置信号

  1. 按钮类控件(QPushButton等)

主要内置信号

  • clicked():按钮被鼠标点击或键盘激活时触发
  • pressed():按钮被按下时立即触发
  • released():按钮被释放时触发
  • toggled(bool checked):可切换按钮状态改变时触发
// 示例:连接按钮点击信号
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
  1. 文本输入类控件(QLineEdit, QTextEdit)

主要内置信号

  • textChanged(const QString &text):文本内容改变时触发
  • textEdited(const QString &text):用户编辑文本时触发
  • returnPressed():按下回车键时触发
  • editingFinished():编辑完成(失去焦点)时触发
// 示例:实时响应文本变化
connect(ui->lineEdit, &QLineEdit::textChanged,[this](const QString &text){qDebug() << "Current text:" << text;});
  1. 选择类控件(QComboBox, QCheckBox, QRadioButton)

主要内置信号

  • currentIndexChanged(int index):当前选项改变时触发
  • currentTextChanged(const QString &text):当前文本改变时触发
  • stateChanged(int state):复选框/单选按钮状态改变时触发
// 示例:响应下拉框选择变化
connect(ui->comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),[](int index){qDebug() << "Selected index:" << index;});

二、信号触发时机详解

  1. 用户交互触发
  • 鼠标事件:点击、双击、悬停等
  • 键盘事件:按键按下、释放、输入等
  • 触摸事件:触摸屏交互
  1. 状态变化触发
  • 值改变:如滑块位置、进度条值等
  • 焦点变化:控件获得/失去焦点
  • 可见性变化:显示/隐藏状态改变
  1. 系统事件触发
  • 定时器超时:QTimer的timeout()信号
  • 网络响应:QNetworkReply的finished()信号
  • 文件系统变化:QFileSystemWatcher的fileChanged()信号

三、常见控件的内置槽函数

  1. 基础功能槽
槽函数作用适用控件
setText(const QString &)设置控件文本QLabel, QLineEdit等
clear()清空内容QLineEdit, QTextEdit等
setEnabled(bool)启用/禁用控件所有QWidget派生类
show()/hide()显示/隐藏控件所有QWidget派生类
// 示例:使用内置槽
connect(ui->actionClear, &QAction::triggered,ui->textEdit, &QTextEdit::clear);
  1. 状态控制槽
槽函数作用适用控件
setChecked(bool)设置选中状态QCheckBox, QRadioButton
setCurrentIndex(int)设置当前选项QComboBox, QTabWidget
setValue(int)设置数值QProgressBar, QSlider
// 示例:控制进度条
connect(ui->startButton, &QPushButton::clicked,[this](){ui->progressBar->setValue(0);});

四、槽函数的作用与分类

  1. 数据操作槽
  • 数据获取:如text()value()
  • 数据设置:如setText()setValue()
  • 数据清除:如clear()reset()
  1. 状态控制槽
  • 启用/禁用控制setEnabled()setDisabled()
  • 可见性控制show()hide()setVisible()
  • 状态切换setChecked()toggle()
  1. 视图操作槽
  • 滚动控制scrollToTop()scrollToBottom()
  • 缩放控制zoomIn()zoomOut()
  • 选择控制selectAll()deselect()

五、信号与槽的高级应用

  1. 自动连接命名槽

QT支持特定命名格式的槽函数自动连接:

// 声明
private slots:void on_pushButton_clicked();// 实现
void MainWindow::on_pushButton_clicked() {// 无需显式connect,自动关联名为"pushButton"的按钮点击信号
}
  1. 信号与槽的连接类型
// 五种连接类型
Qt::AutoConnection      // 自动选择(默认)
Qt::DirectConnection    // 同步直接调用
Qt::QueuedConnection    // 异步队列调用
Qt::BlockingQueuedConnection // 阻塞式队列调用
Qt::UniqueConnection    // 唯一连接(防止重复连接)
  1. Lambda表达式作为槽
connect(ui->pushButton, &QPushButton::clicked, [this](){// 可以直接访问类成员ui->label->setText("Button clicked at " + QTime::currentTime().toString());
});

六、最佳实践建议

  1. 信号-槽连接规范
    • 优先使用新式语法(&Sender::signal形式)
    • 避免在构造函数中连接尚未完全初始化的对象
  2. 资源管理
    • 使用QPointer管理可能被删除的对象
    • 及时断开不再需要的连接(disconnect)
  3. 线程安全
    • 跨线程连接使用QueuedConnection
    • 避免在不同线程间直接操作GUI控件
  4. 性能优化
    • 高频信号考虑节流(throttling)或防抖(debouncing)
    • 大量连接时考虑使用QSignalMapper或lambda统一处理

自定义槽函数

本质:自定义的一个普通的成员函数

可以让QTCreator自动生成

自定义信号

本质:成员函数

函数的定义是QT自己生成的,作为程序员只需要写函数声明即可

signals:自定义信号的关键字

emit:完成信号的发射(emit可以省略)

信号和槽也可以带参数

发射信号的时候,把参数传给对应的参数

信号的参数和槽的参数一致

1)类型匹配

2)个数,信号的参数要多于槽的参数

信号槽存在的意义:解耦合

代码要达到的要求:高内聚,低耦合

具体含义为:对程序影响很小,写代码的时候,某个代码的功能被集中在一起

disconnect的使用方式:类似于connect

lambda表达式简化槽函数的定义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87714.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87714.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87714.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Mitmproxy详解:从入门到实战

一、Mitmproxy简介 Mitmproxy是一款开源的交互式HTTPS代理工具&#xff0c;支持拦截、修改和重放HTTP/HTTPS流量。其核心优势在于&#xff1a; 多平台支持&#xff1a;兼容Windows、macOS、Linux三端工具&#xff1a;提供命令行(mitmproxy)、Web界面(mitmweb)、数据流处理(mi…

刷题笔记--串联所有单词的子串

题目&#xff1a;1、我的写法&#xff08;超时&#xff09;从题面自然想到先用回溯算法把words的全排列先算出来&#xff0c;然后遍历字符串s一次将符合条件的位置加入结果全排列计算所有可能字符串算法写法&#xff1a;这是一个模板用于所有全排列算法的情况&#xff0c;本质思…

操作系统【1】【硬件结构】【操作系统结构】

一、CPU如何执行程序&#xff1f; 提纲 图灵机工作方式冯诺依曼模型线路位宽CPU位宽程序执行基本过程执行具体过程 1. 图灵机工作方式 图灵机可以视作“一台带规则的自动草稿机” 图灵机基本组成&#xff1a; 纸带&#xff08;内存&#xff09;&#xff1a;连续格子组成&…

SQLite与MySQL:嵌入式与客户端-服务器数据库的权衡

SQLite与MySQL&#xff1a;嵌入式与客户端-服务器数据库的权衡 在开发应用程序时&#xff0c;数据库选择是一个至关重要的决策&#xff0c;它会影响应用的性能、可扩展性、部署难度和维护成本。SQLite和MySQL是两种广泛使用的关系型数据库管理系统&#xff0c;它们各自针对不同…

CppCon 2018 学习:Smart References

“强类型别名”&#xff08;strong typedefs&#xff09; 的动机和实现&#xff0c;配合一个简单例子说明&#xff1a; 动机&#xff08;Motivation&#xff09; 用 using filename_t string; 和 using url_t string; 来区分不同的字符串类型&#xff08;比如文件名和网址&…

高性能高准确度的CPU电压与温度监测软件HWInfo

&#x1f5a5;️ 一、软件概述 Windows版&#xff1a;图形化界面&#xff0c;支持实时监控&#xff08;温度、电压、风扇转速等&#xff09;、基准测试及报告生成&#xff0c;兼容Windows XP至Windows 11系统。Linux版&#xff1a;命令行工具&#xff0c;由openSUSE社区维护&a…

H3C WA6322 AP版本升级

1、查看当前版本&#xff1a;R2444P01 2、官网下载升级文件&#xff1a; WA6300系列版本说明H3C WA6300系列(适用于WA6330、 WA6322、WA6320H、WA6320、 WTU630H、WTU630、WA6330-LI、WA6320-C、WA6320-D、WA6320H-LI、WA6338、WA6322H、WTU632H-IOT、WAP922E、WAP923、WA6320…

用 YOLOv8 + DeepSORT 实现目标检测、追踪与速度估算

【导读】 目标检测与追踪技术是计算机视觉领域最热门的应用之一&#xff0c;广泛应用于自动驾驶、交通监控、安全防护等场景。今天我们将带你一步步实现一个完整的项目&#xff0c;使用YOLOv8 DeepSORT实现目标检测、追踪与速度估算。>>更多资讯可加入CV技术群获取了解…

Python实例题:基于 Python 的简单聊天机器人

Python实例题 题目 基于 Python 的简单聊天机器人 要求&#xff1a; 使用 Python 构建一个聊天机器人&#xff0c;支持以下功能&#xff1a; 基于规则的简单问答系统关键词匹配和意图识别上下文记忆功能支持多轮对话可扩展的知识库 使用tkinter构建图形用户界面。实现至少 …

相机:Camera原理讲解(使用OpenGL+QT开发三维CAD)

相机为三维场景提供了灵活便捷的视角变换和交互能力&#xff0c;通过相机操作可以实现全方位、各角度的场景浏览。 怎样在三维场景中引入相机&#xff0c;怎样处理和实现视角的放缩、移动、旋转&#xff1f;在视角旋转时以指定目标为中心又该怎样处理&#xff1f; 原文&#…

开源的虚拟电厂预测数据:资源、应用与挑战

引言 虚拟电厂(Virtual Power Plant, VPP)是一种通过聚合分布式能源资源(如太阳能、风能、储能系统、电动汽车和可控负荷)来优化电力系统运行的数字化能源管理平台。准确的预测数据是虚拟电厂高效运行的关键,而开源数据为研究者和企业提供了低成本、高透明度的解决方案。…

IDE全家桶专用快捷键----------个人独家分享!!

给大家分享一下我个人整理的快捷键&#xff0c;其中包含对电脑的操作&#xff0c;以及在编写代码时的操作&#x1f680;Window系列1 WindowsR 开启运行对话框--->输入cmd启动黑窗口​2 WindowsE 快速打开我的电脑 ​3 WindowsL 电脑锁屏 ​4 WindowsD 显示/恢复桌面 ​5 Win…

人工智能概念:RNN中的基础Encoder-Decoder框架

文章目录一、序列&#xff08;Seq2Seq&#xff09;转换的核心架构二、Encoder-Decoder框架基础原理2.1 整体工作流程2.2 编码器&#xff08;Encoder&#xff09;详解2.3 解码器&#xff08;Decoder&#xff09;工作机制与缺陷三、基础框架的核心缺陷分析&#xff08;以"欢…

R 列表:深入解析与高效应用

R 列表&#xff1a;深入解析与高效应用 引言 在R语言中&#xff0c;列表&#xff08;List&#xff09;是一种非常重要的数据结构&#xff0c;它允许我们将不同类型的数据组合在一起。列表在数据分析和统计建模中扮演着至关重要的角色。本文将深入探讨R列表的概念、创建方法、…

uniapp 国密sm2加密

1. uniapp 国密sm2加密 在uniapp中使用国密SM2算法进行加密解密&#xff0c;你可以通过安装第三方库miniprogram-sm-crypto来实现。这个库提供了SM2、SM3和SM4算法的实现&#xff0c;可以在小程序和uniapp项目中使用。 1.1. 安装miniprogram-sm-crypto 首先&#xff0c;你需要…

07_持续集成与部署:DevOps的核心引擎

07_持续集成与部署:DevOps的核心引擎 引言 在快速迭代的软件开发时代,持续集成(CI)与持续部署(CD)已成为企业提升竞争力的关键。通过自动化构建、测试和部署流程,CI/CD能够显著缩短交付周期,提高软件质量,降低发布风险。本文将深入探讨CI/CD的核心理念、实施路径与最…

电脑休眠设置

Dont Sleep的意思就是“不要睡觉”&#xff0c;用在电脑里就是“阻止休眠”的意思。但这款软件其实有“阻止休眠”和“允许休眠”两个功能。 阻止休眠时可以选择事件&#xff0c;是计时器、电池、CPU、网络这几个事件进行触发阻止休假的功能。 允许休眠也可以根据自己的需求进行…

蓝牙墨水屏上位机学习(3)

main.js中sendimg()函数学习&#xff0c;对应发送图片按钮函数代码如下&#xff1a;async function sendimg() {const canvasSize document.getElementById(canvasSize).value;const ditherMode document.getElementById(ditherMode).value;const epdDriverSelect document.…

Linux应用基础

1. 基础概念 1.1 系统调用 系统调用实际上是Linux内核为上层应用程序提供的API接口&#xff0c;方便应用程序进行调用&#xff0c;类似于SVC。 1.2 库函数 库函数是应用层里边的东西&#xff0c;在系统调用的上层&#xff0c;通常以动态库文件&#xff08;.so&#xff09;形式…

【时间序列数据处理的噩梦与救赎:一次复杂数据可视化问题的深度复盘】

时间序列数据处理的噩梦与救赎&#xff1a;一次复杂数据可视化问题的深度复盘 创建时间: 2025/7/3 技术栈: Vue 3 TypeScript UniApp ECharts 问题级别: &#x1f534; 系统性架构问题 &#x1f3af; 引言&#xff1a;当简单需求变成技术噩梦 “老哥&#xff0c;这个图表时…