QT中的信号和槽函数

2023-10-26

一 信号和槽机制
1 概念
    信号和槽是Qt中自行定义的一种通信机制,实现对象之间的交互,当某个对象发生改变时将会发送信号,该信号可以被其它对象接收,接收以后将执行一个指定的成员函数(槽函数).

图解:

2 定义
1)包含信号或槽的类必须是QObject的子类
2)信号使用“signals:”标记,信号函数只需声明,不能写定义
3)槽使用“public slots:”标记,槽函数可以和某个信号建立连接,通过某个信号触发槽函数的执行;另外槽函数也可以当做是普通的成员函数,直接调用
4)包含信号或槽的类,前面需要添加宏"Q_OBJECT",将来构建工程时,会调用moc(元对象编译器)将语法扩展的信号或槽还原为标准C++代码.

代码的实现格式:
      class XX:public QObject{
          Q_OBJECT //moc
      signals:
          void sigFunc(void);//信号函数
      public slots:
          void slotFunc(void){...}//槽函数
      };    


3 信号和槽连接
  QObject::connect(
      const QObject* sender,        //信号发送对象,可以是QObject所有子类类型 
      const char* signal,         //信号函数
      const QObject* receiver,     //信号接收对象,可以是QObject所有子类类型
      const char* method);        //槽函数


  :    
      SIGNAL(信号函数(参数表))    //将信号函数转换为const char*
      SLOT(槽函数(参数表))        //将槽函数转换为const char*
案例:创建一个Qt应用程序,里面包含一个标签和一个按钮,实现点击按钮关闭标签。

4 信号和槽连接的语法要求
1)信号和槽参数要一致
    QObject::connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int)));//ok
    QObject::connect(A,SIGNAL(sigFunc(void)),B,SLOT(slotFunc(int)));//error

 Qt老版本中槽函数的实现:

     connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int)));

 Qt新版本中槽函数的实现:

     connect(A,Signal1,B,Slot1);

老版本槽函数函数的特点:优点 参数 很直观  缺点 不做类型检测   所以不推荐使用


2)可以带有缺省参数
    class B{
        Q_OBJECT
    public slots:
        void slotFunc(int i=0){}
    };
    QObject::connect(A,SIGNAL(sigFunc(void)),B,SLOT(slotFunc(void)));//ok
3)信号函数的参数可以比槽函数参数多,多余参数将被忽略    相反则不可以
    QObject::connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(void)));//ok
4)一个信号可以同时连接多个槽函数(一对多)
    QObject::connect(A,SIGNAL(sigFunc(int)),B1,SLOT(slotFunc1(int)));//ok
    QObject::connect(A,SIGNAL(sigFunc(int)),B2,SLOT(slotFunc2(int)));//ok
    注:如果A对象发送喜好,B1和B2的槽函数都会被执行
5)多个信号可以同时连接到同一个槽函数(多对一)
    QObject::connect(A1,SIGNAL(sigFunc1(int)),B,SLOT(slotFunc(int)));//ok
    QObject::connect(A2,SIGNAL(sigFunc2(int)),B,SLOT(slotFunc(int)));//ok
    注:无论A1或A2发送信号,B的槽函数都会被执行
6)两个信号函数可以直接连接(信号串联)//了解
    QObject::connect(A1,SIGNAL(sigFunc1(int)),A2,SIGNAL(sigFunc2(int)));//ok
    注:当A1发送信号时,所连接的A2对象的信号也将被发送.

 

在应用槽函数的很多时候也用到了lambda表达式;

Lambda表达式:用于定义并创建匿名的函数对象。

Lambda的语法形式如下:

              [函数对象参数] (操作符重载函数参数) mutable 或exception声明 ->返回值类型 {函数体}

              []是lambda表达式,选择传递的方式

             [](){Btn->settext("aaaa");};

            1,值传递

             [=](){Btn->settext("aaaa");};

            2,址 传递

             [&](){Btn->settext("aaaa");};

具体的使用方法,参考百度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT中的信号和槽函数 的相关文章

随机推荐

  • 数据库原理期末考试题(经典题型)

    一 单选题 题数 4 共 20 0 分 1 在数据库的三级模式结构中 描述数据库中数据的全局逻辑结构和特征的是 A 外模式 B 内模式 C 存储模式 D 模式 我的答案 D 2 公司中有多个部门和多名职员 每个职员只能属于一个部门 一个部门
  • 必须收藏的python兼职网站大全

    当下python需求量还是挺大的 对于想要做兼职的程序员还是挺友好的 起码不用愁找不到 目前来看 其兼职方向大致有三 开发 爬虫 数据分析 就开发来说 目前python的轮子在Github上一抓一大把 开发成本和开发周期相比于其他语言会更低
  • 【Java】自动拆箱与自动装箱

    自动装箱 自动拆箱是 JDK1 5 提供的功能 自动装箱是把一个基本类型的数据直接赋值给对应的包装类型 自动拆箱是把一个包装类型的对象直接赋值给对应的基本类型 通过自动装箱 拆箱功能 可以大大简化基本类型变量和包装类对象之间的转换过程 Ja
  • MSP430F5529库函数学习——串口

    波特率计算网站 导入MSP430Ware 查看例程 原理图和中文开发手册获取 目录 GPIO setAsPeripheralModuleFunctionInputPin 和GPIO setAsPeripheralModuleFunction
  • pythonlist函数使用方法_python中的list() 函数如何用?

    如果一个地区做统计工作 汉字或者其他东西就可以用数字事先写进去 比如 01代表汉族 那么你在写民族的时候有下拉列表 你就可以打01 就会自动识别为汉族 列表的使用便于计算 查找 分析 处理数据 在python中 有内置函数list 函数用于
  • python之flask框架(一)

    python基础部分咱们基本已经掌握 前面也了解了tkinter的基本用法 这次给大家讲解一下很常见的web框架 就是这个flask框架 其实 python的web框架不仅仅是flask 还有Django Weppy Bottle等还有很多
  • shell中临时使用其他用户执行命令

    问题来源于chinaunix博客论坛 感觉比较实用 整理过来了 我在root中执行一个脚本 但是其中的一些命令或脚本必须用oracle用户来执行 bin sh oracle用户执行 su oracle bin cd xxxx xxx bin
  • 云计算基础——云服务

    目录 云服务概述 云服务简介 云服务的产生和发展 云服务产生的前提 接入云端的主要前端工具 云服务的优缺点 优点 缺点 云服务的类型 SaaS PaaS IaaS 云部署模型 云服务概述 云服务简介 云计算通过使计算分布在大量的分布式计算机
  • I18N多文件数据参数动态获取

    在我们的项目中 控制层获取信息 没有用到ResourceBundle getBundle 而是labelcode 的方式 java I18N 如果有多个配置文件 是怎么读取这些信息的 在控制层怎么读取出相对应的信息出来 参数properti
  • 从零开始学web开发之html5-h5概述

    前言 为了掌握多一门技术 于是开始了学习前端技术的脚步 虽然安卓还是没有深入地学习一些比较高端的知识 比如view绘制原理 事件分发机制 属性动画的绘制 没有深入地研究一些流行框架 最遗憾的是没有将rxjava应用到自己的工作中 更加没有学
  • 元宇宙通证-序一:“元宇宙”和“后人类社会”

    序一 元宇宙 和 后人类社会 一 1992年 尼尔 斯蒂芬森的科幻小说 雪崩 促办 好评如潮 雪崩 描述的是脱胎于现实世界的一代互联网人对两个平行世界的感知和认识 但是 不论是做作 还是书评者 都没预见到在30年之后 此书提出的 元宇宙 M
  • 【微服务部署】四、Jenkins一键打包部署NodeJS(Vue)前端项目步骤详解

    本文介绍使用Jenkins一键将NodeJS Vue 前端项目打包并上传到生产环境服务器 这里使用的是直接打包静态页面 发送到远程服务器Nginx配置目录的方式 首先确保服务器环境配置好 安装Nginx 运行目录 日志存放目录等 一 服务器
  • Flutter GetX 状态管理,路由管理,智能依赖注入

    直接上网址 GetX 关于GetX GetX 是 Flutter 上的一个轻量且强大的解决方案 高性能的状态管理 智能的依赖注入和便捷的路由管理 GetX 有3个基本原则 性能 GetX 专注于性能和最小资源消耗 GetX 打包后的apk占
  • java 工具篇(MySQL数据库工具) 数据库实体创建

    第一步 生成工具源代码 package com mysql util import java io File import java io FileWriter import java io IOException import java
  • Linux内核开发三:多进程编程

    1 什么是进程 我们可以通俗地把进程看作是正在运行着的二进制程序 占用内存空间消耗系统资源 例如使用 vim 命令编辑文件内容就会生成一个进程 进程是 OS 资源分配的基本单位 每个进程在操作系统中都执行着特定的任务 如网络服务 etc i
  • shell拷贝mongodb数据库

    拷贝mongodb数据库 mongodump h 服务器IP port 端口 u 用户名 p 密码 d 数据库 o 导出路径 h MongoDB 所在服务器地址 例如 127 0 0 1 当然也可以指定端口号 127 0 0 1 27017
  • VS2019 无法登录 许可证已过期 无法下载许可证

    许可证已过期 点击检查更新的许可证 报出错误 我们无法下载许可证 请检查你的网络连接或代理设置 解决方法 其实问题就在于嵌入式web浏览器的问题 选择账户选项 账户 登录选项 将嵌入式web浏览器改为系统web浏览器 随后就能登录了
  • Android底层驱动开发记录:01_JNI

    最近项目中需要用到了Android底层的开发 正好疫情居家所以又把韦老师的老教程第四期Android教程翻出来学习学习 手边也没有合适的板子 找了一块AIO 3288C的板子接了一块HDMI的屏来用 本来之前一直做单片机的 因此学起来还比较
  • 宝塔漏洞复现

    声明 好好学习 天天向上 漏洞描述 宝塔面板是一款服务器管理软件 支持windows和linux系统 可以通过Web端轻松管理服务器 提升运维效率 例如 创建管理网站 FTP 数据库 拥有可视化文件管理器 可视化软件管理器 可视化CPU 内
  • QT中的信号和槽函数

    一 信号和槽机制 1 概念 信号和槽是Qt中自行定义的一种通信机制 实现对象之间的交互 当某个对象发生改变时将会发送信号 该信号可以被其它对象接收 接收以后将执行一个指定的成员函数 槽函数 图解 2 定义 1 包含信号或槽的类必须是QObj