【Qt教程】1.7 - Qt5带参数的信号、信号重载、带参数的槽函数、槽函数重载

2023-11-01

原理:与C++语法一致,信号、槽函数都可以发生重载,使其在名称不变的情况下,传递过程可以携带参数。

示例说明:我们从一个最普通的信号槽工程中,来修改,对信号、槽进行重载,使信号、槽携带参数。

 

1. 普通信号 - 工程源码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void sendSignalSlot();
    void dealSignalSlot();

signals:
    /*
     * 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用:emit mySignal();
     * 信号可以重载
    */
    void mySignal();


private:
    QPushButton btn1;

};
#endif // WIDGET_H

 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    btn1.setParent(this);
    btn1.setText("sendText");
    btn1.resize(80,25);
    btn1.move(100,100);

    resize(320, 240);
    setWindowTitle("Hello!");

    connect(&btn1, &QPushButton::clicked, this,  &Widget::sendSignalSlot);

    connect(this, &Widget::mySignal, this, &Widget::dealSignalSlot);
}

void Widget::sendSignalSlot()
{
    emit mySignal();
}

void Widget::dealSignalSlot()
{
    btn1.setText("Done!");
}

Widget::~Widget()
{
}

 

现象

  • 点击 "sendText" 按钮,按钮文字变为 "Done!"。

    

 

2. 带参数的信号、信号重载 - 工程源码

  • 信号函数可以发生重载。
  • 信号携带参数时,接受的槽函数也必须带参。
  • connect使用带参信号时,需要使用函数指针。

 

  • 打印调试信息,需要包含头文件:#include <QDebug>
  • 输出字符串需要使用 .toUtf8().data(); 进行转换。

 

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QDebug>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void sendSignalSlot();
    void dealSignalSlot();
    // 信号带参数,槽函数也要带参
    void dealSignalSlotPara(int, QString);

signals:
    /*
     * 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用:emit mySignal();
     * 信号可以重载
    */
    void mySignal();
    void mySignal(int, QString);

private:
    QPushButton btn1;

};
#endif // WIDGET_H

 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    btn1.setParent(this);
    btn1.setText("sendText");
    btn1.resize(80,25);
    btn1.move(100,100);

    resize(320, 240);
    setWindowTitle("Hello!");

    connect(&btn1, &QPushButton::clicked, this,  &Widget::sendSignalSlot);

    // 普通信号
    void (Widget::*funSingle)() = &Widget::mySignal;
    connect(this, funSingle, this, &Widget::dealSignalSlot);
    // 带参数信号
    void (Widget::*funSinglePara)(int, QString) = &Widget::mySignal;
    connect(this, funSinglePara, this, &Widget::dealSignalSlotPara);

}

void Widget::sendSignalSlot()
{
    emit mySignal();
    emit mySignal(100, "发送信号");
}

void Widget::dealSignalSlot()
{
    btn1.setText("Done!");
}

void Widget::dealSignalSlotPara(int a, QString str)
{
    qDebug() << a << "\t"<< str;// 我的系统环境中,不用转换也可以输出,不过会将""也一并输出
    qDebug() << a << "\t"<< str.toUtf8().data();// 需要加转换,才是正常显示
}

Widget::~Widget()
{
}

 

现象

  • 窗口现象与原工程一致,点击 "sendText" 按钮,按钮文字变为 "Done!"。
  • 并且会在应用程序输出窗口,打印传递的参数。

 

3. 带参数的槽函数、槽函数重载 - 工程源码

信号可以重载,同理,槽函数也同样可以重载:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QDebug>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void sendSignalSlot();
    void dealSignalSlot();
    // 槽函数也可以重载。信号带参数,槽函数也要带参。
    void dealSignalSlot(int, QString);

signals:
    /*
     * 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用:emit mySignal();
     * 信号可以重载
    */
    void mySignal();
    void mySignal(int, QString);

private:
    QPushButton btn1;

};
#endif // WIDGET_H

 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    btn1.setParent(this);
    btn1.setText("sendText");
    btn1.resize(80,25);
    btn1.move(100,100);

    resize(320, 240);
    setWindowTitle("Hello!");

    connect(&btn1, &QPushButton::clicked, this,  &Widget::sendSignalSlot);

    // 普通信号 槽函数也可以重载
    void (Widget::*funSingle)() = &Widget::mySignal;
    void (Widget::*funDealSignalSlot)() = &Widget::dealSignalSlot;
    connect(this, funSingle, this, funDealSignalSlot);
    // 带参数信号 槽函数也可以重载
    void (Widget::*funSinglePara)(int, QString) = &Widget::mySignal;
    void (Widget::*funDealSignalSlotPara)(int, QString) = &Widget::dealSignalSlot;
    connect(this, funSinglePara, this, funDealSignalSlotPara);
}

void Widget::sendSignalSlot()
{
    emit mySignal();
    emit mySignal(100, "发送信号");
}

void Widget::dealSignalSlot()
{
    btn1.setText("Done!");
}

void Widget::dealSignalSlot(int a, QString str)
{
    qDebug() << a << "\t"<< str;// 我的系统环境中,不用转换也可以输出,不过会将""也一并输出
    qDebug() << a << "\t"<< str.toUtf8().data();// 需要加转换,才是正常显示
}

Widget::~Widget()
{
}

现象

  • 与上面信号重载的现象一致。

 

4. Qt4的connect简单写法

用Qt4的写法来写connect信号连接:

!!!不建议使用,看似写法简单,出了问题很麻烦。因为SIGNAL、SLOT是将函数名称,转换为字符串格式,并且不进行错误检查。一旦写错在编译阶段无任何报错,运行到故障点时才报错,不容易找到错误位置。而且必须用 public slots关键字修饰槽函数。此方法仅做了解,不推荐使用!!!)

 

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QDebug>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

public slots:
    void sendSignalSlot();
    void dealSignalSlot();
    // 信号带参数,槽函数也要带参
    void dealSignalSlotPara(int, QString);

signals:
    /*
     * 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用:emit mySignal();
     * 信号可以重载
    */
    void mySignal();
    void mySignal(int, QString);

private:
    QPushButton btn1;

};
#endif // WIDGET_H

 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    btn1.setParent(this);
    btn1.setText("sendText");
    btn1.resize(80,25);
    btn1.move(100,100);

    resize(320, 240);
    setWindowTitle("Hello!");

    connect(&btn1, &QPushButton::clicked, this,  &Widget::sendSignalSlot);

//    // 普通信号
//    void (Widget::*funSingle)() = &Widget::mySignal;
//    connect(this, funSingle, this, &Widget::dealSignalSlot);
//    // 带参数信号
//    void (Widget::*funSinglePara)(int, QString) = &Widget::mySignal;
//    connect(this, funSinglePara, this, &Widget::dealSignalSlotPara);

    // Qt4信号连接(不建议用,出了错麻烦,而且必须用 public slots关键字修饰槽函数)
    // Qt4槽函数必须有public slots关键字来修饰
    // 功能等同于上面的用法,不过写错没有错误提示,只有运行时才有调试输出
    connect(this, SIGNAL(mySignal()), this, SLOT(dealSignalSlot()));
    connect(this, SIGNAL(mySignal(int,QString)),
            this, SLOT(dealSignalSlotPara(int,QString)));
}

void Widget::sendSignalSlot()
{
    emit mySignal();
    emit mySignal(100, "发送信号");
}

void Widget::dealSignalSlot()
{
    btn1.setText("Done!");
}

void Widget::dealSignalSlotPara(int a, QString str)
{
    qDebug() << a << "\t"<< str;// 我的系统环境中,不用转换也可以输出,不过会将""也一并输出
    qDebug() << a << "\t"<< str.toUtf8().data();// 需要加转换,才是正常显示
}

Widget::~Widget()
{
}

现象

  • 与上面信号重载的现象一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Qt教程】1.7 - Qt5带参数的信号、信号重载、带参数的槽函数、槽函数重载 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 查看软件版本的cmd命令

    1 查看java版本 java version 2 查看nodejs版本 node v 3 查看npm版本 npm v 4 查看maven版本 mvn version或者mvn v 5 查看git版本 git version 6 查看erl
  • 使用Qt编写模块化插件式应用程序

    一 动态链接库技术概况 动态链接库技术用得很多 事实上 整个Windows就是由一个个动态链接库 DLL 构建起来的 不管是系统内核 或是系统调用的API封装 还是通用工具 如控制面板 ActiveX插件等 都是一个个动态链接库文件 动态链
  • 某个应用的CPU使用率居然达到100%,我该怎么做?(三)

    某个应用的CPU使用率居然达到100 我该怎么做 三 1 引 你们好 可爱的小伙伴们 咱们最常用什么指标来描述系统的CPU性能呢 我想你的答案 可能不是平均负载 也不是CPU上下文切换 而是另一个更直观的指标 gt CPU使用率 CPU使用
  • 基于C++实现的职工信息管理系统

    调用命令的cpp文件 Main cpp include
  • SQL注入之联合注入(一)

    SQL注入联合查询 注入流程 1 获取字段总数 order by group by select 1 2 3 进行连接查询 union select 1 2 3 2 获取数据库 select databale 查看当前数据库名 select
  • css隐藏溢出滚动条

    Chrome Safari div webkit scrollbar display none firefox div scrollbar width none ms overflow style none IE 10 overflow x
  • 目标检测入门——01目标检测概念及数据集

    目标检测入门 01目标检测概念及数据集 1 目标检测 1 1目标检测是什么 在入门阶段 大家经常会混淆分类任务和检测任务 分类任务是要明确图中是什么 属于哪一类 比如是猫还是狗 检测任务是要明确图中有什么 在什么位置 需要用目标框框出来 是
  • Windows安装配置Tomcat服务器教程 ——外网远程访问

    文章目录 前言 1 本地Tomcat网页搭建 1 1 Tomcat安装 1 2 配置环境变量 1 3 环境配置 1 4 Tomcat运行测试 1 5 Cpolar安装和注册 2 本地网页发布 2 1 Cpolar云端设置 2 2 Cpola
  • Neo4j ① <图论>图,节点,关系,属性<知识图谱和图库>图谱,图库,优势<基础>模块,应用场景,环境搭建,浏览器

    目录 第一部分 图 和 Neo4j 1 1 图论 1 1 1 图论起源 柯尼斯堡 Konigsberg 七桥问题 1 1 2 图 和 节点 1 1 3 节点关系表达 1 1 4 属性图模型规则 1 2 知识图谱和图库 1 2 1 知识图谱
  • python selenium对应版本报错及无法找到selenium

    1 点击画红线的地方红色小灯泡 下载 cmd pip show selenium查看是否安装selenium 成功的截图如下 2 此时再次运行 发现Message session not created This version of Ch
  • JWT 续签和多设备登录

    JWT java web token 由头部 载荷 签名三部分组成 其中头部和载荷仅使用了base64进行编码 所以载荷尽量不要传递一些敏感信息 比如 密码之类的 签名主要是用于验签 防止载荷被抓包篡改 这里直接切入主题 续签 jwt to
  • java 2进制常量_【二】Java变量与常量

    1 标识符 标识符 identifier 是指用来标识某个实体的一个符号 在不同的应用环境下有不同的含义 在计算机编程语言中 标识符是用户编程时使用的名字 用于给变量 常量 函数 语句块等命名 以建立起名称与使用之间的关系 标识符通常由字母
  • 解决Flutter旋转屏幕状态栏空缺的问题

    问题 最近要实现一个视频播放器 全屏播放时需要旋转屏幕 把案例拿出来试了一下 旋转屏幕后呈现的状态是这样 解决办法 打开项目下android app src main res values styles xml 添加
  • 对象相等判断&&值传递

    文章目录 对象相等判断 和 equals 的区别是什么 hashCode 与 equals 重要 对象的相等与指向他们的引用相等 两者有什么不同 值传递 对象相等判断 和 equals 的区别是什么 它的作用是判断两个对象的地址是不是相等
  • STP协议详解

    STP协议详解 文章目录 STP协议详解 前言 一 STP协议的运行原理 二 STP协议中ROOT RP DP的选举规则 三 端口状态disable listening learning forwarding blocking所代表的含义
  • vue3组合式api 父子组件数据同步v-model语法糖的用法

    V model 大多数情况是用在 表单数据上的 但它不止这一个作用 父子组件的数据同步 有一个 语法糖 v model 这个方法简化了语法 在elementplus中 都有很多地方使用 所以我们要理解清楚 父组件 使用 v model 向子
  • 【牛客SQL】SQL10 获取所有非manager的员工emp_no

    题目描述 描述 有一个员工表employees简况如下 有一个部门领导表dept manager简况如下 请你找出所有非部门领导的员工emp no 以上例子输出 示例1 输入 drop table if exists dept manage
  • 前端学习——jQuery基础

    一 引入jQuery的js文件 此处是下载好的jquery的js文件 也可以引入cdn 二 jQuery的入口函数 三 DOM对象和jQuery对象 div div 建一个盒子
  • react——state(状态机)

    h1 h1 h1 react state 状态 h1 p react把组件看成是一个状态机 state machines 通过与用户的交互 实现不同状态渲染UI 让用户界面和数据保持一致 p p react里 只需要更新组件的state 然
  • 【Qt教程】1.7 - Qt5带参数的信号、信号重载、带参数的槽函数、槽函数重载

    原理 与C 语法一致 信号 槽函数都可以发生重载 使其在名称不变的情况下 传递过程可以携带参数 示例说明 我们从一个最普通的信号槽工程中 来修改 对信号 槽进行重载 使信号 槽携带参数 1 普通信号 工程源码 widget h ifndef