当前位置: 首页 > news >正文

Qt笔记 信号和槽

在Qt中,如何将两个对象进行关联,让一个对象发出信号,然后另外一个对象接收到信号后,执行该对象的一个方法,要实现这种方式,则需要使用到信号和槽机制。

信号:

信号一定是一个没有返回值的函数,但是参数可以声明为有,也可以声明为没有。而且信号不需要实现只需要其类中进行声明。可以认为信号不是一个函数,而是一个函数的声明。

如:

class A : public QObject
{Q_OBJECT
public:// ...signals:void Asignal();// ...
};

在定义信号和槽相关的类的时候,有几点是需要注意的:

1. 首先要想使用信号和槽,必须要从QObject来进行派生,因为只有QObject类以及其子类才能包含有信号和槽。

2. 必须包含有Q_OBJECT

槽:

槽是一个实实在在的函数,既要进行声明也要实现,这点上和c++中常规的函数没有什么区别,但是槽的返回值一定void类型,槽可以有参数,参数的类型和数量完全取决于你的需求,槽对参数并没有限制。

如:

class MyClass : public QObject
{Q_OBJECT
public:// ...public slots:void mySlot(int parameter1, QString parameter2);// ...
};// 在cpp文件中
void MyClass::mySlot(int parameter1, QString parameter2)
{// 槽的实现
}

信号和槽如何配合使用?

我们使用使用connect来将发生者,发送的信号,接收者,接收后进行的动作绑定在一起,在connect中的实现即为:

connect(sender, signal, recipient, fuction);

其中的所有参数都是地址,不要搞错了。

举个例子:
 

connect(ui->pushButton, &QPushButton::clicked, this, &widget::close);
//这里是使用Qt中默认的信号和信号槽来实现绑定

这样就可以实现点击ui文件中的pushButton,生成一个clicked点击信号,然后widget界面接收到该信号,执行close方法。

其中的widget中的私有成员指针ui指向ui文件生成的界面,这个界面对应的代码中的组件都是以指针的方式存在。

我们知道c++不能使用像“类::成员函数”这样的方式来获得成员函数的地址,因此可以再前面加一个&作为标记符(而不是取地址的意思),来告诉编译器,这个是一个成员函数的地址,这样才能让编译器来获得正确的成员函数地址。

如何自定义信号和信号槽?

1. 在ui界面实现组件转到槽

这样会直接在widget中生成一个信号槽,且该按钮直接关联到该信号槽,点击即可出发信号槽。

2. 如果信号所在的类无法直接发出信号,则在组件跳转槽中抛出一个连接好的信号槽所需的信号,从而实现间接连接信号和信号槽

相关文章:

  • vue中动态显示时间
  • JavaScript 面试题
  • Vue2 和Vue3 双向数据绑定的区别和原理
  • word转pdf怎么转换?这几个转换技巧收好
  • Python将 PDF 转换为 png 图片的教程
  • 【vue2源码】模版编译
  • 室友打团太吵?一条命令断掉它的WiFi
  • Nanya(南亚科技)DRAM芯片选型详解
  • 10:00面试,10:06就出来了,问的问题有点变态。。。
  • 2024.3.19
  • diffusion model(十四): prompt-to-prompt 深度剖析
  • QT 驾校系统界面布局编写
  • Nginx安装和平滑升级
  • 阿里云发布 AI 编程助手 “通义灵码”——VSCode更强了 !!
  • PX4|基于FAST-LIO mid360的无人机室内自主定位及定点悬停
  • 【前端学习】-粗谈选择器
  • 2019年如何成为全栈工程师?
  • HTTP请求重发
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript中的对象个人分享
  • mysql 数据库四种事务隔离级别
  • React Transition Group -- Transition 组件
  • Terraform入门 - 3. 变更基础设施
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 精彩代码 vue.js
  • 删除表内多余的重复数据
  • 听说你叫Java(二)–Servlet请求
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • (1)(1.13) SiK无线电高级配置(五)
  • (1)SpringCloud 整合Python
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (离散数学)逻辑连接词
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (转)原始图像数据和PDF中的图像数据
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .cfg\.dat\.mak(持续补充)
  • .dwp和.webpart的区别
  • .net 调用php,php 调用.net com组件 --
  • .NET 指南:抽象化实现的基类
  • .NET 中创建支持集合初始化器的类型
  • .NET命令行(CLI)常用命令
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [4.9福建四校联考]
  • [C++]拼图游戏
  • [C++基础]-初识模板
  • [CareerCup] 14.5 Object Reflection 对象反射
  • [CISCN2019 华东南赛区]Web4
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [Grafana]ES数据源Alert告警发送