首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Qt】带参数的信号和槽函数

【Qt】带参数的信号和槽函数

作者头像
Yui_
发布于 2025-03-12 00:57:57
发布于 2025-03-12 00:57:57
55000
代码可运行
举报
文章被收录于专栏:Yui编程知识Yui编程知识
运行总次数:0
代码可运行

在前面的文章中,我们已经了解了Qt自带的信号和槽函数以及自定义的信号和槽函数,但是这些都是没有带参数的,其实信号和槽函数是可以带有参数的。

1. 带参数的信号和槽

Qt的信号和槽也是支持带有参数的,同时也支持重载。 此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表一致。 当信号触发时,调用槽函数的时候,信号函数的实参就能被传递到槽函数的形参当中。

1.2 参数匹配的信号和槽函数

下面我回写一个程序,程序的功能是通过两个按钮来传递参数人窗口的标题发生改变。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(this,&Widget::mySignal,this,&Widget::handle);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::handle(QString s)
{
    this->setWindowTitle(s);
}


void Widget::on_pushButton_clicked()
{
    emit mySignal("被按钮1调用");
}

void Widget::on_pushButton_2_clicked()
{
    emit mySignal("被按钮2调用");
}

头文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
signals:
    void mySignal(QString s);
public slots:
    void handle(QString s);

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

当信号函数和槽函数参数匹配时,并不会发生什么,那么现在让我们来看看参数不匹配的情况下是怎么样的吧。

1.2 参数不匹配的信号和槽

参数不匹配的情况可以分为三种:

  1. 槽函数的参数数量大于信号函数的参数数量但参数类型相同
  2. 信号函数的参数数量大于槽函数的参数数量但参数类型相同
  3. 信号函数和槽函数的参数数量相同但参数类型不同 下面开始逐个讲解
1.2.1 槽函数参数数量大于信号函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(this,&Widget::mySignal,this,&Widget::handle);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::handle(QString s1,QString s2)
{
    this->setWindowTitle(s1);
}


void Widget::on_pushButton_clicked()
{
    emit mySignal("被按钮1调用");
}

void Widget::on_pushButton_2_clicked()
{
    emit mySignal("被按钮2调用");
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QString>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
signals:
    void mySignal(QString s1);
public slots:
    void handle(QString s1,QString s2);

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

可以看到,编译器报错了,这也就说明了槽函数参数数量大于信号函数是不可以的。

1.2.2 信号函数参数数量大于槽函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(this,&Widget::mySignal,this,&Widget::handle);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::handle(QString s)
{
    this->setWindowTitle(s);
}


void Widget::on_pushButton_clicked()
{
    emit mySignal("被按钮1调用","");
}

void Widget::on_pushButton_2_clicked()
{
    emit mySignal("被按钮2调用","");
}

可以正常运行,也就表明信号函数的参数个数超过槽函数的参数个数参数个数是可以正常使用的,但是反过来就是不行,槽函数的参数个数大于信号函数的参数个数,无法编译通过。 个数的不一致,槽函数就会按照参数的顺序拿到信号的前N个参数,确保槽函数的每个之都是有值。 思考下,为什么会这样呢?又为什么不要求参数的个数严格一致呢? 如果我们要求参数的个数完全一致,就意味着信号绑定到槽函数的要求变高了,换言之当下的规则允许信号和槽函数之间的绑定更加的灵活,更多的信号可以绑定到这个槽函数上了。

1.2.3 信号函数和槽函数的参数类型不同

会报错~ 带有参数的信号要求信号的参数和槽函数的参数类型是一致的。

2.知识补充

2.1 Q_OBJECT

Qt中如果要让某个类能够使用信号槽,必须要在类最开始的地方,写下Q_OBJECT宏 使用ALT加右键点击

就可以看到里面的内容了,实际上这里还可以再进一步展开,最终会得到一系列很复杂的代码。

2.1 信号槽多对多

所谓的信号槽,终究要解决的问题就是响应用户的操作。 信号槽,其实在GUI开发的各种框架中是一个比较"有特色"的存在。 大部分的GUI开发框架都是一对一的存在 一个事件只能对应一个处理函数,一个处理函数也只能对应到一个事件上。 就比如网页开发中的JS,网页开发中响应用户操作,主要就是挂回调函数。 而Qt专门搞了一个单独的connect来完成信号槽的连接 Qt信号槽的设计,理想很美好,现实很骨感 该机制主要的效果就是:

  1. 解耦合,把触发用户操作的控件和处理对应用户的操作逻辑解耦合。
  2. 多对多的效果:一个信号可以connect到多个槽函数上,一个槽函数,也可以被多个信号connect。 那么什么是多对多呢? 以选课为例,一个学生可以选择多门课,一门课可以被多名学生选择这种。 多对多真的实用吗? 答案是否定的,在实际的开发过程中,随着大家的经验越来越多,其实在GUI开发的过程中,多对多就是一个伪需求,实际的开发中很少用到,绝大情况下一对一就够用了。 所以一些新的图形化开发框架,很少有再继续支持这种多对多的了~

3. 总结

本文我们了解了带参数的信号和槽函数,得知了槽函数会接受到来自信号的参数。且这个参数也是有要求的,信号函数的参数个数可以大于槽函数的参数个数,但是类型必须相同。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Qt】自定义信号和槽函数
这种方式在之前的文章就已经有所涉及了。 关于connect函数的介绍可以看这篇文章【Qt-信号与槽】connect函数的用法-CSDN博客
Yui_
2025/03/09
2950
【Qt】自定义信号和槽函数
初识Qt · 信号与槽 · 自定义和参数
目前接触到的函数是connect,当我们使用的时候,我们发现connect关联的信号和槽,即便是函数,也是Qt中已经存在的,即内置函数,那么我们是否能够自己自定义信号或者说是自己自定义槽函数呢?
_lazy
2025/03/07
2390
初识Qt · 信号与槽 · 自定义和参数
【C++】Qt:TCP&UDP网络通信示例
在功能实现中,获取IP地址有两种方法,一是通过代码自动获取IP地址,二是手动设置IP,默认是手动设置,设置完成后,点击绑定端口,即可开始监听客户端的信息。
DevFrank
2024/07/24
7760
【C++】Qt:TCP&UDP网络通信示例
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
2.4默认创建有窗口类,yWidget,基类有三种选择:QWidget、QMainWindowQDialog
Arya
2024/10/31
8510
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
【QT】QT 的窗口坐标 & 信号与槽
🔥 在Qt中坐标系的开始(原点)是左上角(0,0),从在左上角往右依次增加的是x轴,从左上角往下依次增加的是y轴
IsLand1314
2025/01/09
3800
【QT】QT 的窗口坐标 & 信号与槽
【QT】编写第一个 QT 程序 & 对象树 & Qt 编程事项 & 内存泄露问题
① 创建好一个项目后,我们可以点击 widget.ui 进入图形化界面设计,可以直接通过拖拽的方式进行添加
IsLand1314
2024/12/20
3610
【QT】编写第一个 QT 程序 & 对象树 & Qt 编程事项 & 内存泄露问题
Qt项目---简单的计算器
在这篇技术博客中,我们将介绍如何使用Qt框架实现一个简单的计算器应用。我们将使用C++编程语言和Qt的图形用户界面库来开发这个应用,并展示如何实现基本的算术操作。
莫浅子
2023/10/17
1K0
Qt项目---简单的计算器
Qt多线程1:QThread
Qt有两种多线程的方法,其中一种是继承QThread的run函数,另外一种是把一个继承于QObject的类转移到一个Thread里。 Qt4.8之前都是使用继承QThread的run这种方法,但是Qt4.8之后,Qt官方建议使用第二种方法。两种方法区别不大,用起来都比较方便,但继承QObject的方法更加灵活。这里要记录的是如何正确的创建一个线程,特别是如何正确的退出一个线程。
全栈程序员站长
2022/09/02
3.1K0
QT的基本知识「建议收藏」
QT是一个跨平台应用程序和UI开发框架。具体的安装以及源文件的下载这里不详细介绍。 要在QT界面上添加一个按钮,可以有两种方法:一个是直接拖放一个按钮即可;另一种则是通过程序来添加一种按钮。
全栈程序员站长
2022/08/29
7170
QT的基本知识「建议收藏」
QT5.14.2使用webkit引擎完成网页浏览
WebKit是一个跨平台的 Web 浏览器引擎,据说苹果的Safari、谷歌的 Chrome 浏览器都是基于webkit框架来开发的,而且WebKit还支持移动设备和手机,包括 iPhone 和 Android 手机都是使用WebKit做为浏览器的核心。
DS小龙哥
2022/01/12
2.5K0
QT5.14.2使用webkit引擎完成网页浏览
C/C++ Qt 信号自定义槽函数
Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下我们以老师学生为例子简单学习一下信号与槽函数的使用方法。
王 瑞
2022/12/28
3590
【Qt-信号与槽】connect函数的用法
所谓信号大家都不陌生,生活中的红绿灯就是一种信号,当出现红灯时,你就接受到了一个红灯信号,然后指向停下来的动作。
Yui_
2025/03/02
5580
【Qt-信号与槽】connect函数的用法
Qt初识信号槽
信号就是发生的事件,槽就是处理事件的函数。这两者不在一起,不像MFC的消息循环机制。它们是松散的耦合。要想将它们连接起来,那么必须使用connect函数来连接它们。例如,当我想实现,点击关闭按钮就会关闭当前窗口的操作。那么我就需要使用connect函数来连接“点击”这个信号函数和“关闭”这个槽函数。
zy010101
2020/04/08
9010
Qt自定义信号和槽
案例需求: 创建一个老师类和学生类,下课后,老师触发饿了的信号,学生响应老师饿了的信号,并且请老师吃饭 老师类 .h
大忽悠爱学习
2021/11/15
4030
【QT】Qt 多线程
在 Qt 中,多线程的处理⼀般是通过 QThread 类来实现。QThread 代表⼀个在应用程序中可以独立控制的线程,也可以和进程中的其他线程共享数据。QThread 对象管理程序中的⼀个控制线程。
YoungMLet
2024/08/02
3030
【QT】Qt 多线程
QT应用编程: QGraphicsView+QGraphicsTextItem动态编辑文本
QGraphicsView+QGraphicsTextItem 实现在画布上动态输入,编辑文本。 类似于截图软件、图片编辑器加文字水印的效果。 比如: 类似于windows系统自带的图片编辑器这个效果。
DS小龙哥
2022/01/07
3.6K1
QT应用编程: QGraphicsView+QGraphicsTextItem动态编辑文本
[Qt] 信号与槽:灵活编写多种类型槽函数
在Qt中, 槽函数是响应信号的函数,用来处理用户的交互或者程序中的特定事件。槽函数可以通过 connect函数与信号进行连接。当特定信号发出时,相应的槽函数会被自动调用。下面将详细讲解Qt中槽函数的编写方式,并结合代码示例逐步分析每一种写法。
DevKevin
2024/10/11
5770
初识Qt · 信号与槽总结
对于信号和槽的部分我们这里算是大的知识点已经介绍完了,那么本文的重点就是放在对信号槽的一个总结,当然,对于信号和槽我们还有两个小的知识点没有介绍到,即disconnect和lambda表达式在这里的应用。在这里也会一并介绍到。
_lazy
2025/03/07
1660
初识Qt · 信号与槽总结
【QT】Qt文件和多线程
对于Qt文件QFile的相关关系都在下面这个思维导图里面了,它的父类是QFileDevice,爷爷类是QIODevice,Qt中所有的输入输出的类都是继承自QIODevice,其中也包括网络IO、串口IO、蓝牙IO等
s-little-monster
2024/11/09
4260
【QT】Qt文件和多线程
QT调用IE浏览器COM插件完成网页浏览
QT在5.6之前可以webkit浏览器框架访问网页,在之后就去掉了webkit,加入了QWebEngineView框架,但是QWebEngineView只能支持VS编译器,mingw编译器不支持。 在后面的高版本QT里,mingw编译器如果要加载网页可以使用两种方式。
DS小龙哥
2022/01/12
2.5K0
QT调用IE浏览器COM插件完成网页浏览
相关推荐
【Qt】自定义信号和槽函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档