【Qt教程】1.7 - Qt5带参数的信号、信号重载、带参数的槽函数、槽函数重载
原理:与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带参数的信号、信号重载、带参数的槽函数、槽函数重载相关推荐
- [Qt教程] 第44篇 进阶(四)信号和槽
[Qt教程] 第44篇 进阶(四)信号和槽 楼主 发表于 2013-9-12 16:48:59 | 查看: 298| 回复: 0 信号和槽 版权声明 该文章原创于Qter开源社区 导语 在前面的内容 ...
- QT教程2:QT5的体系构架
一.列出QT5体系内容 QT5的模块有• QtCore • QtGui • QtWidgets • QtMultimedia • QtBluetooth • QtNetwork • QtPositio ...
- 【Qt教程】1.6 - Qt5信号与槽、Single Slot emit、自定义信号、自定义槽
信号与槽 1. 说明 概念:信号和槽,是Qt对象间通信的接口.信号Signal.槽Slot,分别对应着事件的发送端和接受端. 语法: connect( 信号的发送者, 发送的具体信号, 信号的接收者, ...
- 【Qt教程】1.11 - Qt5 标准对话框QMessageBox(关于、错误、信息、警告、问题、颜色、字体、文件对话框)
所谓标准对话框,是Qt内置的一些列对话框,用于简化开发.其实是调用的系统窗口.事实上,有很多对话框都是通用的,比如打开文件.设置颜色.打印设置等.这些对话框在素有程序中几乎相同,因此没有必要在每一个程 ...
- [Qt教程] 第34篇 网络(四)FTP(二)
[Qt教程] 第34篇 网络(四)FTP(二) 楼主 发表于 2013-9-4 15:04:38 | 查看: 315| 回复: 9 FTP(二) 版权声明 该文章原创于作者yafeilinux,转载 ...
- [Qt教程] 第25篇 数据库(五)SQL表格模型QSqlTableModel
[Qt教程] 第25篇 数据库(五)SQL表格模型QSqlTableModel 楼主 发表于 2013-5-21 20:36:22 | 查看: 923| 回复: 7 SQL表格模型QSqlTable ...
- [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
[Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档 楼主 发表于 2013-5-21 22:00:51 | 查看: 475| 回复: 0 使用DOM创建和操作XML文档 版权声明 该 ...
- [Qt教程] 第29篇 XML(三)Qt中的SAX
[Qt教程] 第29篇 XML(三)Qt中的SAX 楼主 发表于 2013-5-21 22:27:59 | 查看: 615| 回复: 5 Qt中的SAX 版权声明 该文章原创于Qter开源社区(ww ...
- [Qt教程] 第40篇 网络(十)WebKit初识
[Qt教程] 第40篇 网络(十)WebKit初识 楼主 发表于 2013-9-11 17:26:05 | 查看: 521| 回复: 10 WebKit初识 版权声明 该文章原创于作者yafeili ...
最新文章
- Nature子刊:微生物系统中的功能与功能冗余
- JavaScript兼容HTML代码的注释
- jQuery获取元素
- oracle端口号为什么有三个,oracle安装时出现一个端口号
- 进程间通信(IPC)+进程加锁解锁
- linux路由信息预览为空,route - 显示并设置Linux中静态路由表
- 数据分析之如何制作数据埋点文档
- EmEditor小功能与使用技巧
- python项目开发实例-有趣的十个Python实战项目,让你瞬间爱上Python!
- java locale string_Java Locale toString()用法及代码示例
- 从零实现深度学习框架——理解广播和常见的乘法
- 在VSCode中使用CUDA
- 微软拼音输入法如何打开添加表情与颜文字?
- 江苏省基础云计算机服务平台,江苏省一师一优课、一课一名师活动-江苏省基础教育云计算服务平台.doc...
- springcloud(一)微服务概述
- PIN PUK1
- HTML怎么做出菱形框架,css3怎么实现菱形渐变?
- Jeesite Login 登录 分析
- 连接Oracle时报错ora-01034与ORA-27101
- 干货!基于层次适应的零样本学习