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

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

1. 普通信号 - 工程源码

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPushButton>class Widget : public QWidget
{Q_OBJECTpublic: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_OBJECTpublic: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_OBJECTpublic: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_OBJECTpublic: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()
{
}

现象

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

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

  1. [Qt教程] 第44篇 进阶(四)信号和槽

    [Qt教程] 第44篇 进阶(四)信号和槽 楼主  发表于 2013-9-12 16:48:59 | 查看: 298| 回复: 0 信号和槽 版权声明 该文章原创于Qter开源社区 导语 在前面的内容 ...

  2. QT教程2:QT5的体系构架

    一.列出QT5体系内容 QT5的模块有• QtCore • QtGui • QtWidgets • QtMultimedia • QtBluetooth • QtNetwork • QtPositio ...

  3. 【Qt教程】1.6 - Qt5信号与槽、Single Slot emit、自定义信号、自定义槽

    信号与槽 1. 说明 概念:信号和槽,是Qt对象间通信的接口.信号Signal.槽Slot,分别对应着事件的发送端和接受端. 语法: connect( 信号的发送者, 发送的具体信号, 信号的接收者, ...

  4. 【Qt教程】1.11 - Qt5 标准对话框QMessageBox(关于、错误、信息、警告、问题、颜色、字体、文件对话框)

    所谓标准对话框,是Qt内置的一些列对话框,用于简化开发.其实是调用的系统窗口.事实上,有很多对话框都是通用的,比如打开文件.设置颜色.打印设置等.这些对话框在素有程序中几乎相同,因此没有必要在每一个程 ...

  5. [Qt教程] 第34篇 网络(四)FTP(二)

    [Qt教程] 第34篇 网络(四)FTP(二) 楼主  发表于 2013-9-4 15:04:38 | 查看: 315| 回复: 9 FTP(二) 版权声明 该文章原创于作者yafeilinux,转载 ...

  6. [Qt教程] 第25篇 数据库(五)SQL表格模型QSqlTableModel

    [Qt教程] 第25篇 数据库(五)SQL表格模型QSqlTableModel 楼主  发表于 2013-5-21 20:36:22 | 查看: 923| 回复: 7 SQL表格模型QSqlTable ...

  7. [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档

    [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档 楼主  发表于 2013-5-21 22:00:51 | 查看: 475| 回复: 0 使用DOM创建和操作XML文档 版权声明 该 ...

  8. [Qt教程] 第29篇 XML(三)Qt中的SAX

    [Qt教程] 第29篇 XML(三)Qt中的SAX 楼主  发表于 2013-5-21 22:27:59 | 查看: 615| 回复: 5 Qt中的SAX 版权声明 该文章原创于Qter开源社区(ww ...

  9. [Qt教程] 第40篇 网络(十)WebKit初识

    [Qt教程] 第40篇 网络(十)WebKit初识 楼主  发表于 2013-9-11 17:26:05 | 查看: 521| 回复: 10 WebKit初识 版权声明 该文章原创于作者yafeili ...

最新文章

  1. Nature子刊:微生物系统中的功能与功能冗余
  2. JavaScript兼容HTML代码的注释
  3. jQuery获取元素
  4. oracle端口号为什么有三个,oracle安装时出现一个端口号
  5. 进程间通信(IPC)+进程加锁解锁
  6. linux路由信息预览为空,route - 显示并设置Linux中静态路由表
  7. 数据分析之如何制作数据埋点文档
  8. EmEditor小功能与使用技巧
  9. python项目开发实例-有趣的十个Python实战项目,让你瞬间爱上Python!
  10. java locale string_Java Locale toString()用法及代码示例
  11. 从零实现深度学习框架——理解广播和常见的乘法
  12. 在VSCode中使用CUDA
  13. 微软拼音输入法如何打开添加表情与颜文字?
  14. 江苏省基础云计算机服务平台,江苏省一师一优课、一课一名师活动-江苏省基础教育云计算服务平台.doc...
  15. springcloud(一)微服务概述
  16. PIN PUK1
  17. HTML怎么做出菱形框架,css3怎么实现菱形渐变?
  18. Jeesite Login 登录 分析
  19. 连接Oracle时报错ora-01034与ORA-27101
  20. 干货!基于层次适应的零样本学习

热门文章

  1. 基金理财系列6 之指数基金
  2. 杨潮观《偷桃捉住东方朔》
  3. IP地址在数据库里面的存储方式
  4. 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装
  5. 【Java从0到架构师】Spring - 复杂对象、Converter
  6. 【Spring 持久层】Spring 事务开发、事务属性详解
  7. 记录一举一动:PowerShell几行代码实现定期屏幕截屏
  8. 五步git操作搞定Github中fork的项目与原作者同步
  9. php 改变图片的宽高,php缩放图片(根据宽高的等比例缩放)示例
  10. mysql 聚集索引 存什么,关于mysql的聚集索引