Qt的信号和槽机制

2023-11-20

在C++中,对象与对象之间通信,要通过调用成员函数的方式来完成。而在Qt中提供了一种对象间的通信方式:信号与槽的机制。

Qt通过QObject来提供这个通信机制。它的工作方式也很简单,通过QObject对象提供的connect连接函数将信号与处理信号的函数进行绑定,当信号被发出时,绑定到这个信号的函数都会被调用。
槽(slot)本质上就是C++类的成员函数,它可以是任何成员函数、静态成员函数、全局函数、Lambda表达式。QObject的连接函数:

connect(sender,SIGNAL(signal),receiver,SLOT(slot));
  1. sender:发出信号的对象
  2. signal:发出的信号
  3. receiver:接收信号的对象
  4. slot:处理信号的函数

一个信号可以绑定到多个槽函数:

connect(sender,SIGNAL(signal),receiver,SLOT(slot1));
connect(sender,SIGNAL(signal),receiver,SLOT(slot2));

多个信号可以绑定到同一个槽函数:

connect(sender,SIGNAL(signal1),receiver,SLOT(slot));
connect(sender,SIGNAL(signal2),receiver,SLOT(slot));

一个信号还可以连接到另一个信号:

connect(sender,SIGNAL(signal1),receiver,SIGNAL(signal2));

解除信号与槽函数之间的绑定:

disconnect(sender,SIGNAL(signal),receiver,SLOT(slot));

注意:信号与槽机制同真正的回调函数相比,时间的消耗还是非常大的,在实时系统(嵌入式实时系统)中要少用,甚至不用。

举个使用信号与槽机制通信的Qt例子:
sender.h

#ifndef SENDER_H
#define SENDER_H

#include <QWidget>

class Sender : public QWidget
{
    Q_OBJECT // 只有继承了QObject类的类才具备使用信号和槽机制通信的能力。
public:
    explicit Sender(){};
    void send(const QString &name);

signals:
    void message(const QString &name);//自定义的信号,它只有是一个函数声明,不需要实现,要求返回类型必须是void。

};

#endif // SENDER_H

receiver.h

#ifndef RECEIVER_H
#define RECEIVER_H

#include <QWidget>

class Receiver : public QWidget
{
    Q_OBJECT
public:
    explicit Receiver(){};
    ~Receiver(){};
    void receive(const QString &msg);

};

#endif // RECEIVER_H

sender.cpp

#include "sender.h"

void Sender::send(const QString &name){
    emit message(name); // 使用emit发送信号
}

receiver.cpp

#include "receiver.h"

void Receiver::receive(const QString &name){
    qDebug()<< "received message:"<< name;
}

main.cpp

#include "myslot.h"
#include "sender.h"
#include "receiver.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Sender sender;//发送者
    Receiver receiver;//接收者
    QObject::connect(&sender,&Sender::message,&receiver,&Receiver::receive);//信号与槽函数的绑定
    sender.send("hello world");//发送信息
    return a.exec();
}

输出:

 received message: "hello world"
  • 参与使用信号与槽机制通信的类都必须继承QObject类(即发送者与接收者都要继承QObject类),只有继承了QObject类的类才具备使用信号和槽机制通信的能。
  • 自定义的信号,它只有是一个函数声明,不需要实现,要求返回类型必须是void。
  • 使用emit发送信号
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt的信号和槽机制 的相关文章

  • 金特 + XNA (C#)

    是否可以使用jint http jint codeplex com操作使用 XNA C 创建的 3D 环境 并向该环境添加功能 再次使用 jint 作为 Jint 的贡献者 我会推荐你Jint http jint codeplex com
  • 在 C# 中使用“using”关键字避免多次处置的最佳实践

    当变量是 IDisposable 时 我们有using关键字来管理处置 但是如果我们在方法中返回值怎么办 using twice StringContent stringToStringContent string str using St
  • JSON.Net 反序列化返回“null”

    我正在使用 JSON Net 反序列化 JSON 字符串 JSON 字符串是 string testJson Fruits Apple color red size round Orange Pro
  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • 如何使用 Roslyn 通过扩展方法、静态类中的方法以及带有 ref/out 参数的方法来访问调用

    我正在致力于创建一个开源项目 用于创建 NET UML 序列图 该项目利用名为 js sequence diagrams 的 javascript 库 我不确定 Roslyn 是适合这项工作的工具 但我想我应该尝试一下 所以我整理了一些概念
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 使用 C# 中的 Google 地图 API 和 SSIS 包获取行驶距离

    更新 找到了谷歌距离矩阵并尝试相应地修改我的代码 我在这里收到无效参数错误 return new GeoLocation dstnc uri ToString catch return new GeoLocation 0 0 https 基
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • 为什么不能调用带有 auto& 参数的 const mutable lambda?

    include
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • “必须声明标量变量”错误[重复]

    这个问题在这里已经有答案了 必须声明标量变量 Id SqlConnection con new SqlConnection connectionstring con Open SqlCommand cmd new SqlCommand cm
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • Kafka性能保证和延时队列实现原理

    数据不丢不漏 不重不错 一 不丢 生产写入消息不丢失 数据组织形式 首先 从数据组织形式来说 kafka有三层形式 kafka有多个主题 topic 每个主题有多个分区 分区分为主分区和副本分区 每个分区又有多条消息 而每个分区可以分布到不
  • epoll文件服务器,基于epoll实现的一个简单的web服务器

    详解1 EPOLLIN 文件描述符可以读 EPOLLOUT 文件描述符可以写 EPOLLPRI 文件描述符有紧急的数据可写 EPOLLERR 文件描述符发生错误 EPOLLHUP 文件描述符被挂起 EPOLLET 文件描述符有事件发生 所用
  • 服务器2012怎么安装无线网卡驱动,如何安装usb无线网卡驱动,教您如何安装电脑usb驱动...

    现在很多人都喜欢用无线上网 其原因就是摆脱了有限的束缚 使得电脑可以随时随地的上网 如果想要使用无线网卡的话 首先需要安装无线网卡驱动 那么无线网卡驱动怎么安装 这里 小编就来给大家分享无线网卡驱动安装的图文教程 对于没有内置无线网卡的台式
  • MacOS全套详细介绍如何下载Nginx

    前言 最近心血来潮试着用Mac下载Nginx 下载过程中也出现了一些下载问题 为了方便诸位更加舒心使用Nginx 避免走一些弯路和阅读大量文档 减少大量不必要的时间 这里就集中从0 1做个详细介绍 1 查看是否有HomeBrew Homeb
  • 理解 Linux 配置文件 [转载]

    理解 Linux 配置文件 转载 http www 900 ibm com developerWorks cn linux management configuration index shtml 分类和使用 Subodh Soni sub
  • echarts坐标轴

    坐标轴 直角坐标系中的 x y 轴 x 轴 y 轴 x 轴和 y 轴都由轴线 刻度 刻度标签 轴标题四个部分组成 部分图表中还会有网格线来帮助查看和计算数据 普通的二维数据坐标系都有 x 轴和 y 轴 通常情况下 x 轴显示在图表的底部 y
  • 服务器处理数据和信息吗,1.1 NG搭建服务器 与 动态数据处理介绍

    fastCGI 动态请求数据处理 1 fastcgi安装步骤 1 configure 生成makefile 2 在 make运行makefile sudo make instll 安装即可 出现错误如下 image png 解决方案如下 找
  • 微服务配置中心springcloud从nacos动态获取最新配置信息

    1 添加nacos配置中心依赖
  • springBoot+MongoTemplate,往多个数据库中插入数据

    一 准备 1 建立一个springBoot的maven项目 使用spring initailizr 或者建立一个maven后自己添加相关springBoot配置
  • 使用Pritunl OpenVPN远程连接:实现安全高效的远程访问

    文章目录 前言 1 环境安装 2 开始安装 3 访问测试 4 创建连接 5 局域网测试连接 6 安装cpolar 7 配置固定公网访问地址 8 远程连接测试 前言 Pritunl是一款免费开源的 VPN 平台软件 但使用的不是标准的开源许可
  • 使用PyCharm Professional Edition开发Flask Web程序

    PyCharm官方页面 https www jetbrains com pycharm 注意 只有专业版支持以下全部操作 社区版和教育版均不支持 一 使用PyCharm创建VirtualEnv File Default Settings D
  • 组合测试方法PK正交分析方法

    测试过程中 我们经常遇到需要覆盖多个变化参数的测试场景 如我们测试BS配置控制客户端组织资源远程配置一个设备时 进行一个设备通道视频参数设置的各种组合测试 如下图 多数情况下 类似于这种多组合测试时 老员工则是依靠经验去进行有针对性的测试
  • C++ 实现获取系统名称

    项目中需要用到操作系统名及版本信息 下面是用两种方法实现的 一种是通过查询注册表 include stdafx h include
  • Qt QGraphicsItem及派生类设置是否可选中,是否可移动

    设置可选中 可移动 setFlags ItemIsSelectable ItemIsMovable 设置不可选中 setFlags flags ItemIsSelectable
  • 在计算机上搭建云服务

    首先是安装VirtualBox虚拟机 这里由于之前已经安装完成 所以不再一一演示 对于虚拟机储存位置的设置 VirtualBox菜单 管理 gt 全局设定 常规页面 选择 默认虚拟电脑位置 即可 创建虚拟机内部虚拟网络 VirtualBox
  • 堆栈01--用两个栈实现队列

    堆栈01 用两个栈实现队列 jz05 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 测试用例 队列先进先出 输入 1 2 输出 1 2 解析
  • U盘装系统教程,一键安装和U盘安装的区别

    装系统教程U盘安装篇 一键安装和U盘安装的区别 一键重装系统工具 优点 1 集成线上重装和本地备份还原功能 让用户多重选择 2 无人值守 无需电脑知识的小白用户也可以使用 3 用户可选择工具自带系统镜像安装 不需要单独下载 缺点 1 线上重
  • Elo评分算法原理与实现

    社交网络 里的Mark Zackburg被女朋友甩后 在舍友的启发下 充分发挥了技术宅男自娱自乐的恶搞天分 做出了Facemash网站 对学校女生的相貌进行排名打分 结果网站访问流量过大 直接把学校网络搞瘫痪了 Facemask大受欢迎的关
  • 创建vue项目,完整步骤

    1 安装nodejs node官网 https nodejs org en 检测是否安装成功 node v npm v 电脑上有多版本node时 需要用 nvm 管理工具 2 全局安装脚手架 vue cli npm install vue
  • Qt的信号和槽机制

    在C 中 对象与对象之间通信 要通过调用成员函数的方式来完成 而在Qt中提供了一种对象间的通信方式 信号与槽的机制 Qt通过QObject来提供这个通信机制 它的工作方式也很简单 通过QObject对象提供的connect连接函数将信号与处