【小沐学QT】QT学习之信号槽使用

文章目录

  • 1、简介
  • 2、代码实现
    • 2.1 界面菜单“转到槽”方法
    • 2.2 界面信号槽编辑器方法
    • 2.3 QT4.0的绑定方法
    • 2.4 QT5.0之后的绑定方法
    • 2.5 C++11的方法
    • 2.6 lamda表达式方法
  • 结语

1、简介

在GUI编程中,当我们更改一个小部件时,我们通常希望通知另一个小程序。更普遍地说,我们希望任何种类的物体都能够相互通信。例如,如果用户单击“关闭”按钮,我们可能希望调用窗口的Close()函数。
在这里插入图片描述

其他工具包使用回调实现这种通信。回调是指向函数的指针,因此,如果您希望处理函数通知您某个事件,您可以将指向另一个函数的指针(回调)传递给处理函数。然后,处理函数在适当的时候调用回调。虽然使用这种方法的成功框架确实存在,但回调可能是非直观的,并且在确保回调参数的类型正确性方面可能会遇到问题。
在这里插入图片描述

在Qt中,我们有一种替代回调技术的方法:我们使用信号和槽。当特定事件发生时,会发出一个信号。Qt的小部件有许多预定义的信号,但我们总是可以对小部件进行子类化,以向它们添加我们自己的信号。槽是响应于特定信号而调用的函数。Qt的小部件有许多预定义的插槽,但通常的做法是对小部件进行子类化,并添加自己的插槽,以便处理您感兴趣的信号。
在这里插入图片描述
信号与槽是用于对象之间的通信的,这是 Qt 的核心。为此 Qt 引入了一些关键字,他们是slots、signals、emit,这些都不是 C++关键字,是 Qt 特有的,这些关键字会被 Qt 的 moc转换为标准的 C++语句。

  • 连接规则:
    1、信号参数可以比槽函数多,反之则不可以
    2、 一个信号可以连接多个槽
    3、多个信号可以连接到一个槽
    4、一个信号可以与另一个信号连接

2、代码实现

2.1 界面菜单“转到槽”方法

在按钮上鼠标右键弹出菜单,选择“转到槽…”,如下:
在这里插入图片描述
弹出小窗口,选择“clicked()”后确定。
在这里插入图片描述
然后在文件里自动生成代码如下:

  • mainwindow.h
private slots:
    void on_pushButton_clicked();
  • mainwindow.cpp
void MainWindow::on_pushButton_clicked()
{
    QMessageBox::information(this, "", "on_pushButton_clicked");
}

2.2 界面信号槽编辑器方法

打开信号槽编辑界面,添加记录,设置相关参数。
在这里插入图片描述
在mainwindow.ui界面定义文件中会自动生成对应的代码,可以手动修改。
在这里插入图片描述

2.3 QT4.0的绑定方法

Qt4使用了SIGNAL和SLOT这两个宏,将信号和槽的函数名转换成了字符串。使用字符串导致了Qt4有以下缺点:一旦出现连接不成功的情况,Qt 4 是没有编译错误的

connect(obj1, SIGNAL(fun1(param1, param2,...)), obj2, SLOT(fun2(param1,...)));

优点:对所有控件都适用。
缺点:书写繁琐,槽函数必须在slots标签下。

(1)和控件有关系的信号槽

  • mainwindow.h
private slots:
    void pushButon1_clicked();
  • mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(pushButon1_clicked()));
}

void MainWindow::pushButon1_clicked()
{
    QMessageBox::information(this, "", "pushButon1_clicked");
}

(2)和控件无关系的信号槽

  • mainwindow.h
signals: //信号:
    void mySignal_1(int a);
	void mySignal_2(int a, float b);

private slots: //槽:
    void mySlot_1(int b);
    void mySlot_2(int b);
  • mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
	
	//信号槽:
    connect(this,SIGNAL(mySignal_1(int)),this,SLOT(mySlot_1(int)));
	connect(this, SIGNAL(mySignal_2(int, float)), this, SLOT(mySlot_2(int)));
}
void MainWindow::mySlot_1(int b)
{
    QString str = QString::number(b);
    QMessageBox::information(this, "1", str);
}
void MainWindow::mySlot_2(int b)
{
    QString str = QString::number(b);
    QMessageBox::information(this, "2", str);
}
void MainWindow::test()
{
	//发送信号:
	emit mySignal_2(5, 2.2);
    emit mySignal_1(123);
}

注意:在不进行参数传递时,信号槽绑定时也是要求信号的参数数量大于等于槽函数的参数数量。这种情况一般是一个带参数的信号去绑定一个无参数的槽函数。

2.4 QT5.0之后的绑定方法

  • mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->pushButton,&QPushButton::clicked,this,&::MainWindow::pushButon1_clicked);
}

void MainWindow::pushButon1_clicked()
{
    QMessageBox::information(this, "", "pushButon1_clicked");
}

connect()函数基于函数指针的重载形式:

[static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, 
const QObject *receiver,
PointerToMemberFunction method,
Qt::ConnectionType type = Qt::AutoConnection)

注意:这是QT5中加入的一种重载形式,指定信号和槽两个参数不再使用SIGNAL()和 SLOT()宏,并且槽函数不再必须是使用slots关键字声明的函数,可以是任意能和信号关联的成员函数。要使一个成员函数可以和信号关联,那么这个函数的参数数目不能超过信号的参数数目,但是并不要求该函数拥有的参数类型和信号中对应的参数类型完全一致,只需要可以进行隐式转换即可。

connect(dlg, &myWindwow::test1, this, &myWidget::test2);

2.5 C++11的方法

  • mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->pushButton, QOverload<bool>::of(&QPushButton::clicked),this,&::MainWindow::pushButon1_clicked);
}

void MainWindow::pushButon1_clicked()
{
    QMessageBox::information(this, "", "pushButon1_clicked");
}

2.6 lamda表达式方法

还支持C++11 中的lambda表达式,可以在关联时直接编写信号发射后要执行的代码。

connect(dlg, &MyWindow::test1, [ = ](int value){
	ui->label->setText(tr("获取的值是:%1"),arg(value));
});
  • mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->pushButton, QOverload<bool>::of(&QPushButton::clicked),[=](){
          QMessageBox::information(this, "", "lamda表达式绑定成功!");
    });
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->pushButton, &QPushButton::clicked, this, [=](){
           QMessageBox::information(this, "", "lamda表达式绑定成功2!");
    });
}

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何测试抖音

如何测试抖音 其实&#xff0c;现在的面试题&#xff0c;对于基础的测试用例和场景考察越来越多样化&#xff0c;就跟这样一道面试题。 面试官一上来就是跟我说下怎么测试刷抖音&#xff1f; 很多人一上来就开始各种UI测试&#xff0c;兼容性测试&#xff0c;易用性测试&#…

SWOT分析法是什么?

SWOT法又称态势分析法&#xff0c;是一种通过分析对象内外部因素从而得出战略结论的分析方法。核心理念在于通过对影响因素进行分类梳理&#xff0c;再通过聚合考虑来得出结论。主要就是四个维度&#xff1a;优势&#xff08;Strengths&#xff09;、劣势&#xff08;Weaknesse…

深度学习介绍与环境搭建

深度学习介绍与环境搭建 慕课大学人工智能学习笔记&#xff0c;自己学习记录用的。&#xff08;赋上连接&#xff09; https://www.icourse163.org/learn/ZUCC-1206146808?tid1471365447#/learn/content?typedetail&id1256424053&cid1289366515人工智能、机器学习与…

C++ 二分查找函数lower_bound() 和 upper_bound()

lower_bound() 和 upper_bound() 是 C 标准库中的函数&#xff0c;用于在有序序列中查找目标值的插入位置。 lower_bound() 函数&#xff1a; lower_bound() 函数返回一个迭代器&#xff0c;指向第一个不小于目标值的元素位置。 template<class ForwardIt, class T> F…

怎么根据输入的网站url获得域名及主机ip地址(代码)

好久没更新csdn了。24年二月最后一天&#xff0c;写篇文章吧&#xff0c;作为24年第一篇文章&#xff0c;是不是最后一篇我就不知道了。 最近在写端口扫描的代码&#xff0c;输入是网站的url&#xff0c;输出是开放的端口。 首先就要将输入的网站url转化为域名和主机ip地址&a…

方格分割644--2017蓝桥杯

1.用dfs解决&#xff0c;首先这题的方格图形就很像一个走迷宫的类型&#xff0c;迷宫想到dfs&#xff0c;最中心点视为起点&#xff0c;起点有两个小人在这个方格里面对称行动&#xff0c;直到走出迷宫&#xff08;一个人走出来了另一个人就也走出来了&#xff0c;而走过的点会…

0代码自动化测试:RF 框架实现企业级 UI 自动化测试!

RobotFramework框架可以作为公司要做自动化 但是又不会代码的一种临时和紧急情况的替代方案&#xff0c;上手简单。 前言 现在大家去找工作&#xff0c;反馈回来的基本上自动化测试都是刚需&#xff01;没有自动化测试技能&#xff0c;纯手工测试基本没有什么市场。 但是很多人…

入栏需看——《python》专栏介绍专栏目录

《python》专栏介绍&专栏目录 专栏地址&#xff1a;点击跳转 专栏导航如下&#xff1a; 文章目录 &#x1f330;基础篇&#x1f330;自动篇&#x1f330;自动篇-办公&#x1f330;自动篇-运维 &#x1f330;分享篇&#x1f330;题库篇&#x1f381;产品篇&#x1f330;可视…

虚拟机看不到共享文件夹

johnjohn-virtual-machine:/mnt/hgfs$ cat /etc/issue Ubuntu 20.04.6 LTS \n \l 看下是否挂载 johnjohn-virtual-machine:/mnt/hgfs$ vmware-hgfsclient FPGAs_AdaptiveSoCs_Unified_2023.2_1013_2256 xilinx 取消挂载 johnjohn-virtual-machine:/mnt/hgfs$ sudo umount /mn…

网络——DHCP服务器、DNS服务器实验

网络——DHCP服务器、DNS服务器实验 一、DHCP服务器实验 DHCP——动态主机配置协议&#xff0c;用来管理ip地址的分配。网络中的每台计算机都有至少一个ip地址。在Windows网络连接对话框中可以设置成自动获取ip地址&#xff0c;这样主机作为DHCP client就可以自动从DHCP serve…

算法 - 【二叉树中的第 K 大层和】

二叉树中的第 K 大层和 题目示例1示例2 分析代码 题目 给你一棵二叉树的根节点 root 和一个正整数 k 。树中的层和是指同一层上节点值的总和。返回树中第 k 大的层和&#xff08;不一定不同&#xff09;。如果树少于 k 层&#xff0c;则返回 -1 。注意&#xff0c;如果两个节点…

前端mock数据 —— 使用Apifox mock页面所需数据

前端mock数据 —— 使用Apifox 一、使用教程二、本地请求Apifox所mock的接口 一、使用教程 在首页进行新建项目&#xff1a; 新建项目名称&#xff1a; 新建接口&#xff1a; 创建json&#xff1a; 请求方法&#xff1a; GET。URL&#xff1a; api/basis。响应类型&#xff1…

Linux-nginx服务

一.Nginx概述 1.定义 一款高新能、轻量级Web服务软件 系统资源消耗低 对HTTP并发连接的处理能力高 单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 2.Nginx模块作用 &#xff08;1&#xff09;main模块 全局配置模块&#xff0c;所有模块都要执行遵守&#xf…

如何使用Docker部署WBO容器并实现固定公网地址访问本地白板界面

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

【数学】【深度优先搜索】【图论】【欧拉环路】753. 破解保险箱

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 数学 深度优先搜索 图论 欧拉环路 LeetCode753. 破解保险箱 有一个需要密码才能打开的保险箱。密码是 n 位数, 密码的每一位都是范围 [0, k - 1] 中的一个数字。 保险箱有一种特殊的密码校验方法&#xff0c;你可以随意…

阿里云服务器大降价20%,简单拥有五年三台2h4gECS,组建公网集群

要在阿里云ECS上组建集群&#xff0c;您可以按照以下步骤进行操作&#xff1a; 创建ECS实例&#xff1a;登录阿里云控制台&#xff0c;选择ECS实例&#xff0c;点击“创建实例”按钮。根据实际需求选择实例的配置参数&#xff0c;例如实例规格、操作系统、网络等。根据需要选择…

如何利用IP代理高效采集产品数据,打造爆品?

文章目录 一、什么是网络爬虫&#xff1f;二、普通人如何通过网络爬虫赚钱&#xff1f;2.1、心得分享2.2、工具自动化收集信息 三、 动态IP代理3.1、覆盖范围3.2、性价比3.3、教程中心F&Q使用教程 3.4、在网络数据采集中的重要性 四、实战应用案例一&#xff1a;ebay电商【…

Achronix以创新FPGA技术推动智能汽车与先进出行创新

全球领先的高性能现场可编程门阵列&#xff08;FPGA&#xff09;和嵌入式FPGA&#xff08;eFPGA&#xff09;半导体知识产权&#xff08;IP&#xff09;提供商Achronix Semiconductor公司宣布&#xff0c;该公司将参加由私募股权和风险投资公司Baird Capital举办的“Baird车技术…

汽车后视镜反射率检测仪厂家

随着汽车工业的快速发展&#xff0c;汽车后视镜作为驾驶员观察车辆周围环境的重要工具&#xff0c;其性能和质量对于交通安全至关重要。汽车后视镜的反射率检测仪是一种用于检测汽车后视镜反射性能的专业设备&#xff0c;其重要性不言而喻。本文将重点介绍汽车后视镜反射率检测…

Linux|centos7|yum和编译安装ImageMagick记录

一&#xff0c; yum安装imagemagick imagemagick这个软件是图像文件的处理神器&#xff0c;可以文字转图像以及图像的剪辑等等工作&#xff0c;也是配合人工智能工程的不可或缺的工具&#xff0c;具体的用处和特点就不在这里废话了&#xff0c;有兴趣的百度就行了 本次是在…