学习信号和槽(1)

信号和槽函数

  • 一、了解信号和槽的概念
  • 二、信号和槽的使用
    • 2.1、第一种方法
    • 2.2、第二种方法
    • 2.3、第三种方法
    • 2.4、第四种方法
    • 2.5、第五种方法

一、了解信号和槽的概念

信号(Signal):就是在特定条件下被发射的事件,比如QPushButton 最常见的信号就是鼠标单击时发射clicked()信号。

槽函数:当我们收到这个信号后,需要有一个函数对信号响应,这个函数就是槽函数,槽函数跟一般的函数用法一样,只不过槽函数可以跟信号进行关联。当信号被发射时,槽函数将会自动执行。

Qt中,信号的三个要素:

信号源:由哪个控件发出的信号。
信号的类型:用户进行不同的操作,就可能触发不同的信号;点击按钮,触发点击信号;在输入框中移动光标,触发移动光标的信号;勾选一个复选框,选择一个下拉框,都会触发出不同的信号。
信号的处理方式:槽 => 函数;Qt中可以使用connect这样的函数,把一个信号和一个槽关联起来,后续只要信号触发了,Qt就会自动执行槽函数。

补充:
所谓的触发信号,一定是先把信号的处理方式都准备好,在触发信号。
所谓的槽函数本质就是一种回调函数(callback)。
还有什么也用到了回调函数?

c语言阶段:
1.实现转移表,降低代码的“圈复杂度”。
2.实现回调效果 => qsort
c++阶段:
1.STL中函数对象/仿函数。
2.lambda表达式。
Linux中:
1.信号处理函数
2.线程的入口函数
3.epoll基于回调机制

二、信号和槽的使用

connect是QObject(所有类的祖先)提供的一个静态成员函数。(Qt中提供的这些类,存在一定的继承关系)

2.1、第一种方法

Qt5写法
connect静态成员函数的格式:

connect(const QObject *sender, //当前信号是哪个控件发出来的const char *signal,    //信号的类型const QObject *receiver, //哪个对象负责处理const char *method,     //槽函数(信号如何处理,提供一个成员函数)Qt::ConnectionType type = Qt::AutoConnection

第一、第二参数不匹配或者第三、第四参数不匹配(2、4参数的函数指针不是1、3参数的成员函数,就会不匹配),就会编译出错。
在这里插入图片描述
创建一个按钮,然后使用connect进行信号和槽的连接
在这里插入图片描述
点击程序“退出”按钮,点击信号被触发,就会处理槽函数。

connect(button1, &QPushButton::clicked,this,&Widget::close);

推荐使用这种写法,信号名字、槽函数名字写错了,编译器会直接报错。
c++中,不允许使用两种不同的指针类型,相互赋值。

2.2、第二种方法

Qt4写法
这是Qt4的写法,从Qt5开始就不需要写SIGNAL和SLOT宏了,给connect提供了重载版本,第二个参数和第二个参数成了泛型参数,允许我们传入任意类型的函数指针。

connect(button1, SIGNAL(&QPushButton::clicked),this,SLOT(&Widget::close));

2.3、第三种方法

lambda表达式写法

connect(ui->pushButton,&QPushButton::clicked,[=](参数){//具体代码this->close();}); 

推荐使用,适用于slot代码比较少的逻辑

2.4、第四种方法

牵线法
这种方法就是在ui控件上,点击控件绑定一个槽函数,然后再自己写槽函数逻辑,但是看着比较混乱,不太推荐。

2.5、第五种方法

自动生成法
在ui设计界面里直接点击控件,选择转到槽,再在里面选择槽函数。(通过这个方式,还可以很直观的看到某个控件有哪些槽函数)
1.拖动按钮到窗口,然后右键,转到槽
在这里插入图片描述
2.widget.cpp文件的代码为

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* button =new QPushButton(this);button->setText("按钮");button->move(300,300);connect(button,&QPushButton::clicked,this,&Widget::handleClikecd);}
Widget::~Widget()
{delete ui;
}
void Widget::handleClikecd()
//按下按钮,修改窗口标题
{this->setWindowTitle("窗口被按下");
}
//退出按钮的槽函数
void Widget::on_pushButton_clicked()
{this->close();
}

注意:widget.h文件里的声明要与widget.cpp文件里的定义相匹配。
点击退出,程序关闭,点击按钮,窗口标题被修改。
在这里插入图片描述
在Qt中除了connect来连接信号槽之外,还可以通过函数名的方式来自动连接。

//void Widget::on_这个部分是按钮的objectName_信号的名字();
void Widget::on_pushButton_clicked();

当符合上述规则之后,Qt就能自动的把信号和槽建立连接。

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

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

相关文章

美国西储大学(CRWU)轴承故障诊断——连续小波(CWT)变换

1.数据集介绍 2.代码 import random import matplotlib matplotlib.use(Agg) from scipy.io import loadmat import numpy as npdef split(DATA):step = 400;size = 1024;data = []for i in range(1, len(DATA) - size, step):data1 = DATA[i:i + size]data.append(data1)rand…

内网穿透初步探索实践

内网穿透初步 正常来说两台Linux设备只有在同一局域网下才可以进行互相的ssh远程登录 那么如果不在一个网段下&#xff0c;比方说一台在家里连着家里的WIFI&#xff0c;一台在学校连着实验室的WIFI&#xff0c;这种情况要想实现ssh远程登录则需要用到内网穿透 这就需要用到一…

什么是期权内在价值?怎么计算?

今天期权懂带你了解什么是期权内在价值&#xff1f;怎么计算&#xff1f;内在价值&#xff0c;也称为内涵价值、内在价格&#xff0c;指的是若期权合约到期&#xff0c;权利方能够赚到的市场价与行权价之间的差价收益。 什么是期权内在价值&#xff1f; 期权的内在价值是指期权…

java项目——图书管理系统

文章目录 前言图书管理系统整体框架&#xff1a;book包user包Main包&#xff1a;iooperation包总结&#xff1a; 前言 针对这些天所学的javaSE的知识&#xff0c;用一个小项目来实践一下。 图书管理系统 整体框架&#xff1a; 采取面向对象的思想实现此项目&#xff0c;首先…

从华为云OBS到AWS云上S3:迁移及相关事项

随着云计算的快速发展&#xff0c;企业越来越倾向于将数据存储和管理移到云端。华为云的对象存储服务&#xff08;OBS&#xff09;和亚马逊云服务&#xff08;AWS&#xff09;上的简单存储服务&#xff08;S3&#xff09;是两个备受欢迎的选择。对于那些考虑从华为云OBS迁移到A…

安全攻防三

一、IDS: 当黑客绕过了防火墙&#xff0c;你该如何发现&#xff1f; IDS &#xff08;Intrusion Detection System&#xff0c;入侵检测系统&#xff09; NIDS 内网中检测网络流量攻击 黑客如果已经进去内网&#xff0c;防火墙就没办法保护了 NIDS部署在交换机和路由器这些路…

从零开始实现自己的串口调试助手(1) - ui界面搭建

UI 界面搭建 ui界面整体演示 ui对象拆分 更多的细节就不方便展开了&#xff0c;下面有提示完成ui设计的提示 在创建工程前 记得把编码改为utf-8 ui设计技巧: ctrl 鼠标左键实现拖动实现复制粘贴 groupBox &#xff1a; 带标题的文本框 栅格布局 -- 只有一个控件的时候会铺满…

vue系列之 插槽(Slot) 详解

插槽在vue中是一种很常见的写法&#xff0c;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式。一共有三种分类&#xff1a;默认插槽、具名插槽、作用域插槽&#xff0c;下面一一结合案例详细说明。原创不易&#xff0c;需要的小伙伴 收藏关注 哦…

基于Vue的自定义服务说明弹窗组件的设计与实现

基于Vue的自定义服务说明弹窗组件的设计与实现 摘要 随着技术的不断发展&#xff0c;前端开发面临着越来越高的复杂性和不断变化的需求。传统开发方式往往将整个系统构建为整块应用&#xff0c;这导致对系统的任何微小改动都可能触发整体的逻辑变更&#xff0c;从而增加了开发…

B站pink老师HTML5基础(一)

文章目录 一、网页1.什么是网页2.什么是HTML二、常用浏览器 三、Web标准四、HTML标签1.HTML基本结构标签 五、快捷键六、常用标签1.标题标签2.段落和换行标签3.文本格式化标签4.div标签和span标签5.图像标签6.图像路径7.超链接标签8.特殊字符 一、网页 1.什么是网页 2.什么是H…

什么是领导力?如何提高领导能力?

什么是领导能力&#xff1f; 简单来说&#xff0c;领导力就是通过自身的影响力&#xff0c;让他人服从自己的想法行动&#xff0c;在一个组织和集体中&#xff0c;领导力的作用十分重要。对于一个公司的管理层来说&#xff0c;领导能力是不可或缺的一部分&#xff0c;公司存在…

黑马python-面向对象程序设计

1.定义类 class 类名&#xff1a; 代码 ….. 注意&#xff1a;类名要满足标识符命名规则&#xff0c;同时遵循大驼峰命名习惯 2.self&#xff1a; self指调用该函数的对象 3.创建对象 对象名类&#xff08;&#xff09; 4.添加获取对象属性 对象名.属性名值 5._init_()方法&…

Hadoop+Spark大数据技术 实验8 Spark SQL结构化

9.2 创建DataFrame对象的方式 val dfUsers spark.read.load("/usr/local/spark/examples/src/main/resources/users.parquet") dfUsers: org.apache.spark.sql.DataFrame [name: string, favorite_color: string ... 1 more field] dfUsers.show() -----------…

李飞飞亲自撰文:大模型不存在主观感觉能力,多少亿参数都不行

近日&#xff0c;李飞飞连同斯坦福大学以人为本人工智能研究所 HAI 联合主任 John Etchemendy 教授联合撰写了一篇文章&#xff0c;文章对 AI 到底有没有感觉能力&#xff08;sentient&#xff09;进行了深入探讨。 「空间智能是人工智能拼图中的关键一环。」知名「AI 教母」李…

【数据结构】P1 数据结构是什么、算法怎样度量

1.1 基本概念与术语 数据&#xff1a; 数据是信息的载体&#xff0c;是所有能被计算机识别以及处理的符号。数据元素&#xff1a; 数据元素是数据基本单位&#xff0c;由若干 数据项 组成&#xff0c;数据项是构成数据元素最小的单位。 e . g . e.g. e.g. 数据元素如一条学生记…

Leetcode 2028

思路&#xff1a;1-6之间的的n个数组合起来要变成sum_t mean*(rolls.size()n) - sum(rolls) ; 那么可以先假设每个数都是sum_t / n 其中这个数必须要在1 - 6 之间否者无法分配。 然后可以得出n * (sum_t / n ) < sum ; 需要对余数mod进行调整&#xff0c;为了减少调整的次…

接口测试及接口测试常用的工具详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息…

深入了解 CSS 预处理器 Sass

今天我们来深入探讨一下 CSS 预处理器 Sass。我们将学习什么是 Sass,如何使用它,以及它是如何工作的。 什么是 Sass? Sass 是 syntactically awesome style sheets 的缩写,是一种 CSS 预处理器。它是 CSS 的扩展,为基础 CSS 增加了更多的功能和优雅。普通的 CSS 代码很容…

sklearn监督学习--k近邻算法

sklearn监督学习 一、分类与回归二、泛化、过拟合与欠拟合三、k近邻算法四、分析KNeighborsClassifier五、k近邻算法用于回归优点、缺点和参数 一、分类与回归 监督学习是最常用也是最成功的机器学习类型之一。监督机器学习问题主要有两种&#xff0c;分别叫做分类与回归。分类…

IDEA项目通过 tomcat运行报错: 404 请求的资源不可用

SpringBootVue项目 IDEA运行 Tomcat&#xff0c;自动打开网页报错 HTTP状态 404 - 未找到 类型 状态报告 消息 请求的资源[/WarehouseManagerApi_war/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/9.0.89 但是运行访问 …