【Qt开发】信号与槽

news2025/7/11 8:49:38

目录

1,信号与槽的介绍

2,信号与槽的运用

3,自定义信号


1,信号与槽的介绍

        在Qt框架中,信号与槽机制是一种用于对象间通信的强大工具。它是在Qt中实现事件处理和回调函数的主要方法。

  • 信号:窗口中,当某个事件发生时,一个类可能会发出一个信号。例如,按钮被点击、窗口被关闭等。信号是自动触发的,无需用户干预,它的本质就是事件。

  • :槽是用来接收并处理信号的函数。槽函数执行特定的操作来响应接收到的信号。简单来说,对信号做出的响应动作就称之为槽。通常,会将槽与信号关联起来,以便处理。槽的本质是一种回调函数,在Qt5以及更高版本中,槽函数与普通函数基本没啥区别。

        在Qt中,用户和控件的每次交互过程称为一个事件。比如 “用户点击按钮” 是⼀个事件,“用户关闭窗口” 也是⼀个事件。每个事件都会发出一个信号,信号发出后将会进行槽处理,例如用户点击按钮会发出 “按钮被点击” 的信号,用户关闭窗口会发出 “窗口被关闭” 的信号,然后接收该信号的槽将会执行对应的处理函数。

2,信号与槽的运用

认识QObject:

        QWidget是 Qt 框架中的一个核心基类,主要用于实现对象间的通信机制(如信号与槽机制),并提供基础的对象管理功能,如事件处理、几何坐标管理、内置信号和槽等,这一点通过Qt的不断学习我们会诼渐认识到。

        Qt系统中提供的类本身是存在一定的继承关系。如QPushButton、QLineEdit、QTextEdit、QLabel等,它们都有共同的父类,即QWidget,它是一个控件,也就是图形化界面中的小部件。QWidget还有一个父类——QObject。可以说所有的事务类都继承QObject。

        在Qt中,每个继承自QWidget(或者更准确地说,继承自QObject)的部件(Widget)都内置了一系列预定义的信号和槽,例如,QPushButton有一个clicked()信号,当按钮被点击时会发出这个信号。

认识connect函数:

        在 Qt 中,QObject 类提供了一个静态成员函数 connect(),该函数用于连接信号和槽。

函数格式:

        形式 一:connect(const QObject *sender,

                                                const char *signal,

                                                const QObject *receiver,

                                                const char *method,

                                                Qt::ConnectionType type = Qt::AutoConnection)

​​​​​​​        形式二:connect(const QObject* sender,

                                     const QMetaMethod& signal,
                                     const QObject* receiver,

                                     const QMetaMethod& method,
                                     Qt::ConnectionType type = Qt::AutoConnection);

参数说明:​​​​​​​

        sender:发出信号的对象。

        signal:要连接的信号。

        receiver:接收信号并处理它的对象。

        method:槽,即响应信号的方法。

        type:用于指定关联方式,暂时先不做考虑。

        形式二中第二个参数和第四个参数使用函数指针代替字符串来指定信号和槽,使编译器在编译期检查信号和槽的签名是否兼容,从而减少运行时错误。

connect运用样例:

    QPushButton* pushButton = new QPushButton(this);
    pushButton->setText("Qt");
    connect(pushButton, &QPushButton::clicked, this, &Widget::handleClick);

    槽函数的定义:

    void Widget::handleClick()
    {
        if (pushButton->text() == QString("Qt")) {
            pushButton->setText("Hello Qt");
        }
        else {
            pushButton->setText("Qt");
        }
    }

        注意:通过图形化界面生成的信号与槽机制(.ui文件进行操作)时,槽函数的名称不能随意更改,因为 .ui 文件内部专门生成的槽函数名来连接信号的,若是修改了函数名,它将不能正常连接。

3,自定义信号

        自定义信号在实际开发中很少遇到,因为内置的信号基本包含了用户的事件相关操作。这里知道即可。

        信号是一种特殊的函数机制,它的返回值必须是void,参数可有可无。这个函数的定义是 Qt 在编译过程中自动生成的,因此,自定义信号只需写出函数声明,并告诉 Qt 这是一个 “信号” 即可。

        自定义信号的运用需要使用 signals(自定义信号的标志)和 emit(发送信号)关键字。内置信号不需要手动触发(也可以使用emit发送,改变触发模式),用户在 GUI 进行相关操作时,就会自动触发信号。发送信号的代码已经内置到 Qt 框架中了。

样例:

      widget.h文件里的Widget类中添加以下代码:

              signals:
                      void mySignal(const QString&);  // 自定义信号mySignal()
                      void handleMySignal(const QString&); // 槽函数

      在widget.cpp文件中添加以下代码:

               // 连接信号与槽

              connect(this, &Widget::mySignal, this, &Widget::handleMySignal);
              // 发送出自定义的信号,类似内置信号中用户点击按钮然后自动发送信号。
              emit mySignal("处理自定义信号");// 发送信号的操作是根据用户操作的情况进行的
            void Widget::handleMySignal(const QString& text)// 参数text="处理自定义信号"
            {
                this->setWindowTitle(text);
            }

        注意:Qt5及更高的版本中,不加 emit 也能发送信号,但建议还是加上,使代码可读性更高。自定义信号的参数可以比槽函数的参数数量多,但参数之间的类型必须一样,且槽函数的参数不能比信号的参数多。因为一个槽函数可以绑定多个信号,若严格要求参数个数一致,就意味着信号绑定到槽函数的要求就变高了,而这样设置是为了使更多的信号绑定到一个槽函数上。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用聊天模型和提示模板构建一个简单的 LLM 应用程序

官方教程 官方案例 在上面的链接注册后,请确保设置您的环境变量以开始记录追踪 export LANGSMITH_TRACING"true" export LANGSMITH_API_KEY"..."或者,如果在笔记本中,您可以使用以下命令设置它们 import getpass imp…

探索 C++23 的 views::cartesian_product

文章目录 一、背景与动机二、基本概念与语法三、使用示例四、特点与优势五、性能与优化六、与 P2374R4 的关系七、编译器支持八、总结 C23 为我们带来了一系列令人兴奋的新特性,其中 views::cartesian_product 是一个非常实用且强大的功能,它允许我们轻…

【docker】--镜像管理

文章目录 拉取镜像启动镜像为容器连接容器法一法二 保存镜像加载镜像镜像打标签移除镜像 拉取镜像 docker pull mysql:8.0.42启动镜像为容器 docker run -dp 8080:8080 --name container_mysql8.0.42 -e MYSQL_ROOT_PASSWORD123123123 mysql:8.0.42 连接容器 法一 docker e…

Ensemble Alignment Subspace Adaptation Method for Cross-Scene Classification

用于跨场景分类的集成对齐子空间自适应方法 摘要:本文提出了一种用于跨场景分类的集成对齐子空间自适应(EASA)方法,它可以解决同谱异物和异谱同物的问题。该算法将集成学习的思想与域自适应(DA)算法相结合…

如何通过 Windows 图形界面找到 WSL 主目录

WSL(Windows Subsystem for Linux)是微软开发的一个软件层,用于在 Windows 11 或 10 上原生运行 Linux 二进制可执行文件。当你在 WSL 上安装一个 Linux 发行版时,它会在 Windows 内创建一个 Linux 环境,包括自己的文件系统和主目录。但是,如何通过 Windows 的图形文件资…

深入 MySQL 查询优化器:Optimizer Trace 分析

目录 一、前言 二、参数详解 optimizer_trace optimizer_trace_features optimizer_trace_max_mem_size optimizer_trace_limit optimizer_trace_offset 三、Optimizer Trace join_preparation join_optimization condition_processing substitute_generated_column…

每日一道leetcode

790. 多米诺和托米诺平铺 - 力扣(LeetCode) 题目 有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 "L" 的托米诺形。两种形状都可以旋转。 给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返…

CD3MN 双相钢 2205 材质保温 V 型球阀:恒温工况下复杂介质控制的高性能之选-耀圣

CD3MN 双相钢 2205 材质保温 V 型球阀:恒温工况下复杂介质控制的高性能之选 在石油化工、沥青储运、食品加工等行业中,带颗粒高粘度介质与料浆的恒温输送面临着腐蚀、磨损、堵塞等多重挑战。普通阀门难以兼顾耐高温、强密封与耐腐蚀性,导致设…

python酒店健身俱乐部管理系统

目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中&#xf…

嵌入式开发学习(第二阶段 C语言基础)

综合案例《猜拳游戏》 需求: 本游戏是一款单机游戏,人机交互 规则: 需要双方出拳:石头、剪刀、布赢: 石头→剪刀剪刀→ 布布 →石头 两边出拳相等输: … 实现: 选择对手玩家出拳对手出拳判断胜…

YOLOv1:开启实时目标检测的新篇章

YOLOv1:开启实时目标检测的新篇章 在深度学习目标检测领域,YOLO(You Only Look Once)系列算法无疑占据着重要地位。其中,YOLOv1作为开山之作,以其独特的设计理念和高效的检测速度,为后续的目标…

FFmpeg多路节目流复用为一路包含多个节目的输出流

在音视频处理领域,将多个独立的节目流(如不同频道的音视频内容)合并为一个包含多个节目的输出流是常见需求。FFmpeg 作为功能强大的多媒体处理工具,提供了灵活的流复用能力,本文将通过具体案例解析如何使用 FFmpeg 实现…

分子动力学模拟揭示点突变对 hCFTR NBD1结构域热稳定性的影响

囊性纤维化(CF) 作为一种严重的常染色体隐性遗传疾病,全球约有 10 万名患者深受其害。它会累及人体多个器官,如肺部、胰腺等,严重影响患者的生活质量和寿命。CF 的 “罪魁祸首” 是 CFTR 氯离子通道的突变,…

关于SIS/DCS点检周期

在中国化工行业,近几年在设备维护上有个挺有意思的现象,即SIS和DCS这两个系统的点检周期问题,隔三差五就被管理层会议讨论,可以说是企业管理层关注的重要方向与关心要素。 与一般工业行业中设备运维不同,SIS与DCS的点…

【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现

1 限流的重要性 在高并发系统中,保护系统稳定运行的关键技术有缓存、降级和限流。 缓存通过在内存中存储常用数据,减少对数据库的访问,提升系统响应速度,如浏览器缓存、CDN缓存等多种应用层面。降级则是在系统压力过大或部分服务…

CST软件仿真案例——太阳能薄膜频谱吸收率

CST软件中的太阳能薄膜的功率吸收可用光频电磁波在介质材料中的损耗来计算。本案例计算非晶硅的功率吸收,然后考虑真实太阳频谱,计算有效吸收频谱。 用太阳能单元模板,时域求解器: 材料库提取四个材料,非晶硅&#xf…

ABAP+旧数据接管的会计年度未确定

导资产主数据时,报错旧数据接管的会计年度未确定 是因为程序里面使用了下列函数AISCO_CALCULATE_FIRST_DAY,输入公司代码,获取会计年度,这个数据是在后台表T093C表中取数的,通过SE16N可以看到后台表数据没有数&#xf…

养生:打造健康生活的全方位策略

在生活节奏不断加快的当下,养生已成为提升生活质量、维护身心平衡的重要方式。从饮食、运动到睡眠,再到心态调节,各个方面的养生之道共同构建起健康生活的坚实基础。以下为您详细介绍养生的关键要点,助您拥抱健康生活。 饮食养生…

贪吃蛇游戏排行榜模块开发总结:从数据到视觉的实现

一、项目背景与成果概览 在完成贪吃蛇游戏核心玩法后,本次开发重点聚焦于排行榜系统的实现。该系统具备以下核心特性: 🌐 双数据源支持:本地存储(localStorage)与远程API自由切换 🕒 时间维度统计:日榜/周榜/月榜/全时段数据筛选 🎮 模式区分:闯关模式(关卡进度…

屏幕与触摸调试

本章配套视频介绍: 《28-屏幕与触摸设置》 【鲁班猫】28-屏幕与触摸设置_哔哩哔哩_bilibili LubanCat-RK3588系列板卡都支持mipi屏以及hdmi显示屏的显示。 19.1. 旋转触摸屏 参考文章 触摸校准 参考文章 旋转触摸方向 配置触摸旋转方向 1 2 # 1.查看触摸输入设备 xinput…