学习信号和槽(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,一经查实,立即删除!

相关文章

Flutter 中的 Opacity 小部件:全面指南

Flutter 中的 Opacity 小部件&#xff1a;全面指南 在Flutter中&#xff0c;动画和视觉效果是提升用户体验的重要手段。Opacity小部件允许你改变子组件的透明度&#xff0c;从而实现淡入、淡出或其它透明度相关的动画效果。本文将提供Opacity的全面指南&#xff0c;帮助你了解…

linux 查看 线程名, 线程数

ps -T -p 3652 ps H -T <PID> ps -eLf | grep process_name top -H -p <pid> 查看进程创建的所有线程_ps 显示一个进程的所有线程名字-CSDN博客

美国西储大学(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…

【渗透基础】windows登录的明文密码

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 在这个过程中&#xff0c;明文密码只会在用户输入时短暂存在于内存中&#xff0c;随后立即被加密并丢弃&#xff0c;以确保密…

前端大屏幕开发注意点

前端大屏幕&#xff08;如数据展示大屏、监控面板等&#xff09;的开发有其特定的挑战和考虑要点&#xff0c;以确保内容在高分辨率、大尺寸显示设备上能够清晰、美观且高效地展示。以下是一些关键的注意点&#xff1a; 响应式设计&#xff1a;虽然大屏幕不像移动设备那样面临多…

内网穿透初步探索实践

内网穿透初步 正常来说两台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…

C# ManualResetEvent的理解和用法

ManualResetEvent是C#中一个比较常用的工具&#xff0c;可用于线程间通信&#xff0c;实现一种类似信号量的功能。 这里的信号量与Java中的信号量Semaphore不同。 Java中的信号量Semaphore&#xff0c;是控制有限资源的并发访问。 这里的ManualResetEvent&#xff0c;更像是一种…

安全攻防三

一、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; 带标题的文本框 栅格布局 -- 只有一个控件的时候会铺满…

RTSPtoWebRTC、RTSPtoWeb ( 自HTML播放):页面中预览摄像机视频,无插件的播放方式,适合局域网使用,无需流媒体服务器

文章目录 引言I 环境准备II RTSPtoWebRTC2.1 下载和编译2.2 配置config.jsonIII RTSPtoWebRTC问题优化: 使用http接口生成视频资源进行播放3.1 调用http接口生成视频资源进行播放3.2 启动关闭IV RTSPtoWeb4.1 config.json4.2 RTSPPlayersee also引言 需求: 海域感知,云台监控…

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_()方法&…

Spring Aware接口:揭秘Bean生命周期中的“先知”角色与源码剖析

1. 引言 在Spring框架中&#xff0c;Bean的生命周期是一个复杂而精细的过程&#xff0c;涉及到Bean的创建、初始化、属性注入以及销毁等多个阶段。为了增强Bean与Spring容器之间的交互能力&#xff0c;Spring提供了一系列Aware接口&#xff0c;这些接口允许Bean在生命周期的不…

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() -----------…