【Qt-信号与槽】connect函数的用法

🏠个人主页:Yui_
🍑操作环境:Qt Creator
🚀所属专栏:Qt

在这里插入图片描述

文章目录

  • 1.信号和槽的概念
    • 1.1 信号的本质
    • 1.2 槽的本质
    • 1.3 补充说明
    • 2. 信号和槽的使用
    • 2.1 connect函数介绍
    • 2.2 connect函数的简单使用
      • 2.2.1 图形化方式
      • 2.2.2 代码方式
    • 2.3 查看内置信号和槽
  • 3. 知识补充——connect的参数类型问题

在正式介绍 connect函数前,还需要好好了解信号和槽的概念

1.信号和槽的概念

所谓信号大家都不陌生,生活中的红绿灯就是一种信号,当出现红灯时,你就接受到了一个红灯信号,然后指向停下来的动作。
image.png
同时,如果你也有学习Linux的经历,也会学到信号Signal,是系统内部的通知机制。
Linux中的信号会涉及到3个要素:

  • 信号源:谁发送的信号。
  • 信号的类型:哪种类型的信号。
  • 信号的处理:执行自定义的信号处理函数或者使用系统默认的处理函数。
    Qt中的信号和Linux中的信息,虽然不是一样的概念,但其实也有相似之处。
    Qt中谈到信号,也会涉及到三个要素:
  • 信号源:由哪个控件发出的信号。
  • 信号的类型:用户进行的不同操作,比如’用户点击按钮’、'用户关闭窗口’都是一个事件,每个事件都会发出一个信号,点击按钮触发点击信号,在输入框中移动光标,触发移动光标的信号。
  • 信号的处理方式:Qt中的所有控件都具有接受信号的能力,一个控件还可以接受多个不同的信号。对于接受到的每个信号,控件都会做出响应的动作,在Qt中,对信号做出的响应动作就称之为槽
    我们写GUI程序,就是要让用户进行操作,就是要和用户进行交互,这个过程中就需要关注,用户当前的具体操作是什么样的操作。

信号和槽是Qt中特有的消息传输机制,他能将相互独立的控件关联起来,比如按钮窗口本身就是两个独立的控件,点击按钮并不会对窗口造成任何影响。通过信号和槽机制,可以将按钮和窗口进行关联,实现点击按钮会使窗口关闭的效果。
演示:
Qt_close.gif
现在你可能看不懂,但当学完connect函数就没问题了。
image.png

1.1 信号的本质

信号的本质是事件
信号是由于用户对窗口或者控件进行了某种操作,导致窗口或者控件产生了某个特定的事件,这时Qt对于的窗口类会发送某个信号,以此对用户的操作做出反应。
常见的事件有:

  • 按钮单点、双击。
  • 窗口刷新。
  • 键盘输入。
    。。。
    那么信号Qt中的信号通过什么样的形式呈现够使用者的呢?
    当某个事件产生了,Qt框架会调用某个对应的信号函数,通知使用者。
    信号的呈现形式就是函数

1.2 槽的本质

槽的本质就是对信号响应的函数,是一个回调函数。
槽函数与一般的函数不同,槽函数可以与一个信号关联,当信号产生时,关联的槽函数会自动被执行。

1.3 补充说明

信号和槽机制底层是通过函数间的相互调用实现的,每个信号都可以用函数来表示,称为信号函数,每个槽也可以用函数表示,称为槽函数。例如按钮被按下,这个信号可以用clicked()函数表示,窗口关闭这个槽可以用close()函数表示,假如使用信号和槽机制实现点击按钮会关闭窗口的功能,其实就是使用clicked()函数调用close()函数的效果。
信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别在于:

  • 信号函数使用signals关键词修饰,槽函数用private slots/protected slots/public slots修饰。signals/slots是Qt中在C++的基础上扩展的关键字,专门指明信号函数和槽函数。
  • 信号函数只需要声明,不需要定义(实现),而槽函数需要定义(实现)。

信号函数的定义自动在编译之前生成,编写Qt应用程序的程序员无需关注。
这种自动生成代码的机制称为元编程,在很多场景中都能见到。

2. 信号和槽的使用

在Qt中,QObject类提供了一个静态成员函数connect()函数,改函数专门用来关联指定的信号函数和槽函数。

2.1 connect函数介绍

connect(const QObject* sender,const char* singal,const QObject* receiver,const char* method,Qt::ConnectionType type = Qt::AutoConnection)

参数说明:

  • sender:信号的发送者。
  • signal:发送的信号(信号函数)。
  • receiver:信号的接受者。
  • method:接受信号的槽函数。
  • type:用于指定关联的方式,默认的关联方式为Qt::AutoConnection,通常不需要手动设置。

2.2 connect函数的简单使用

connect函数的简单使用,我们要实现的功能就是点击按钮使得按钮上的Hello World变成Hello Yui.

2.2.1 图形化方式

image.png
开始编辑处理代码:
widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{ui->pushButton->setText("Hello Yui");
}

Qt_hello_yui.gif

2.2.2 代码方式

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);button = new QPushButton(this);button->setText("Hello World");button->move(200,200);connect(button,&QPushButton::clicked,this,&Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{button->setText("Hello Yui");
}

Qt_hello_yui_code.gif

2.3 查看内置信号和槽

系统自带的信号和槽通常通过Qt的帮助文档来查询。
就比如我们要查看按钮的信号,在帮助文档中输入QPushButton
image.png
然后再去文档中寻找signals
如果没有找到,继续去父类中查找。比如QPushButton的父类QAbstractButton

image.png
image.png

3. 知识补充——connect的参数类型问题

connect(const QObject* sender,const char* singal,const QObject* receiver,const char* method,Qt::ConnectionType type = Qt::AutoConnection)

可以看到的是singalmethod的类型都是char* ,但是我们传递的却是函数指针,就比如method的函数指针类型是void(*)()这可对不上,C++可不允许你使用两个不同的指针类型相互赋值。那么这是怎么一回事呢?
以这个代码为例

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);button = new QPushButton(this);button->setText("Hello World");button->move(200,200);connect(button,&QPushButton::clicked,this,&Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{button->setText("Hello Yui");
}

现在的写法为

connect(button,&QPushButton::clicked,this,&Widget::handle);

但是在Qt5以前的写法为:

connect(button,SIGNAL(&QPushButton::clicked),this,SLOT(&Widget::handle));

Qt5开始,对上述的写法做出了简化,不需要写SIGNAL和SLOT宏了,给connect提供了重载版本,在重载版本中,第二个参数和第四个参数成了泛型参数,允许我们传入任意类型的函数指针了。
按住ctrl加鼠标左键跳转
image.png
此时的connect函数就带有一定的参数检查功能,
如果你传入的第一个参数和第二个参数不匹配,或者第三个参数和第四个参数不匹配,代码会编译出错,这里用到了类型萃取。


往期文章:
【Qt】初始项目代码解释-CSDN博客
【Qt】HelloWorld程序-CSDN博客

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

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

相关文章

ESP32+Mixly-WiFi

#include <WiFi.h> #include <TimeLib.h> #include <NtpClientLib.h>int8_t timeZone 8; // 时区设置&#xff0c;东八区为8 const PROGMEM char *ntpServer "ntp1.aliyun.com"; // NTP服务器地址void setup(){Serial.begin(9600); //初始化串口…

Python 数据可视化(一)熟悉Matplotlib

目录 一、安装包 二、先画个折线图 1、修改标签文字和线条粗细 2、内置样式 3、scatter() 绘制散点图 4、scatter() 绘制多个点 5、设置样式 6、保存绘图 数据可视化指的是通过可视化表示来探索和呈现数据集内的规律。 一、安装包 win R 打开终端 安装 Matplotlib&…

目标检测——数据处理

1. Mosaic 数据增强 Mosaic 数据增强步骤: (1). 选择四个图像&#xff1a; 从数据集中随机选择四张图像。这四张图像是用来组合成一个新图像的基础。 (2) 确定拼接位置&#xff1a; 设计一个新的画布(输入size的2倍)&#xff0c;在指定范围内找出一个随机点&#xff08;如…

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(六) 导航栏 和 个人信息设置

1.导航栏&#xff08;navbar&#xff09; 在components下面 创建NavBar.jsx import { MessageSquare,Settings,User,LogOut} from "lucide-react" import {Link} from "react-router-dom" import { useAuthStore } from "../store/useAuthStore&qu…

如何通过 LlamaIndex 将数据导入 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 逐步介绍如何使用 RAG 和 LlamaIndex 提取数据并进行搜索。 在本文中&#xff0c;我们将使用 LlamaIndex 来索引数据&#xff0c;从而实现一个常见问题搜索引擎。 Elasticsearch 将作为我们的向量数据库&#xff0c;实现向量搜索&am…

yunedit-post ,api测试比postman更好

postman应该是大家最熟悉的api测试软件了&#xff0c;但是由于它是外国软件&#xff0c;使用它的高端功能注册和缴费都比较麻烦。生成在线文档分享也经常无法访问被拦截掉。 这里可以推荐一下yunedit-post&#xff0c;该有的功能都有。 https://www.yunedit.com/postdetail …

Gopeed 各种类型的文件资源下载器 v1.6.7 中文版

Gopeed 是一款由 Go 和 Flutter 开发的下载器。它具有简洁美观的界面以及强大的功能&#xff0c;支持 HTTP、BitTorrent、Magnet 等协议&#xff0c;并且可以在全平台上使用。 开发语言及技术&#xff1a;Gopeed 采用 Go 和 Flutter 进行开发。Go 语言具有高效、简洁的特点&am…

3d投影到2d python opencv

目录 cv2.projectPoints 投影 矩阵计算投影 cv2.projectPoints 投影 cv2.projectPoints() 是 OpenCV 中的一个函数&#xff0c;用于将三维空间中的点&#xff08;3D points&#xff09;投影到二维图像平面上。这在计算机视觉中经常用于相机标定、物体姿态估计、3D物体与2D图…

Linux操作系统5-进程信号3(信号产生总结与核心转储)

上篇文章&#xff1a;Linux操作系统5-进程信号2&#xff08;信号的4种产生方式&#xff0c;signal系统调用&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;myLerningCode/l25 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重点&#xff1a;核心…

Linux《基础开发工具(上)》

在之前的篇章当中我们已经了解了Linux当中基本的指令以及相关的知识&#xff0c;那么接下来在本篇当中就开始学基本的开发工具&#xff0c;在此我们一共要了解6大开发工具&#xff0c;在此将这些工具的学习分为上中下篇&#xff0c;在本篇当中我们首先要来学习的是yun以及vim,一…

kali liux的下载

Kali Linux | Penetration Testing and Ethical Hacking Linux Distributionhttps://www.kali.org/ VMware虚拟机https://pan.quark.cn/s/aa869ffbf184 【补充一个今天学到的知识昂和内容无关:&#xff08;遥感&#xff09;指非接触的远距离探测技术&#xff0c;使用传感器探…

微软AI900认证备考全攻略:开启AI职业进阶之路

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正深刻地改变着我们的工作和生活。微软AI900认证作为AI领域的权威认证之一&#xff0c;不仅为技术爱好者提供了深入探索AI的机会&#xff0c;更是开启AI职业进阶之路的重要敲门砖。以下是一份全面的备考攻略&am…

【Mark】记录用宝塔+Nginx+worldpress+域名遇到的跨域,301,127.0.0.1,CSS加载失败问题

背景 想要用宝塔搭建worldpress&#xff0c;然后用域名直接转https&#xff0c;隐藏掉ipport。 结果被折磨了1天&#xff0c;一直在死活在301&#xff0c;127.0.0.1打转 还有css加载不了的情况 因为worldpress很多是301重定向的&#xff0c;所以改到最后我都不知道改了什么&am…

算法题001——移动零

移动零 力扣——移动零点击链接即可跳转 这道题的数组被划分为两个区间&#xff0c;前一个区间为 非零元素&#xff0c;而后一个指针是 零元素 我们运用双指针&#xff0c;先定义两个指针&#xff0c;分别为 dest 和 cur , cur用来遍历整个数组&#xff0c;而 dest 表示我们…

Selenium自动化测试:如何搭建自动化测试环境,搭建环境过程应该注意的问题

最近也有很多人私下问我&#xff0c;selenium学习难吗&#xff0c;基础入门的学习内容很多是3以前的版本资料&#xff0c;对于有基础的人来说&#xff0c;3到4的差别虽然有&#xff0c;但是不足以影响自己&#xff0c;但是对于没有学过的人来说&#xff0c;通过资料再到自己写的…

mysql 全方位安装教程

下载 MySQL 【官网下载地址】 注意要选择较大的哪个安装包&#xff0c;小的安装包是一个安装器。 我们不用登录&#xff0c;直接下载 直接运行下载好的安装包 MySQL如果是 安装包安装, 可以图形化界面自主配置 如果是压缩包解压, 可以配置 配置文件, 可以解压安装到指定的…

深入刨析 之C++ string类

欢迎来到干货小仓库&#xff01;&#xff01;&#xff01; 没有完美的计划&#xff0c;每个人都在试验的过程中渐渐清晰!!! 1.标准库的string类 a. string是表示字符串的字符串类。 b. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作string的常规操…

【AI论文】MedVLM-R1:通过强化学习激励视觉语言模型(VLMs)的医疗推理能力

摘要&#xff1a;推理是推进医学影像分析的关键前沿领域&#xff0c;其中透明度和可信度对于赢得临床医生信任和获得监管批准起着核心作用。尽管医学视觉语言模型&#xff08;VLMs&#xff09;在放射学任务中展现出巨大潜力&#xff0c;但大多数现有VLM仅给出最终答案&#xff…

深入理解并实现自定义 unordered_map 和 unordered_set

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 在 C 的标准模板库&#xff08;STL&#xff09;中&#xff0c;unorder…

使用ChatGPT-Deep Reaserch两步给出文献综述!

文献综述是学术论文写作中不可或缺的一部分&#xff0c;它不仅是对已有研究的梳理和总结&#xff0c;更是为后续研究奠定理论基础的关键步骤。通过文献综述研究者能够全面了解当前研究领域的现状、主要观点和研究方法&#xff0c;从而找到自己研究的切入点和创新点。这一过程需…