Qt5教程: (4) 带参数信号与槽
在subwidget.h中声明一个signal. 和之前的信号函数重名但是有参数:
void backSignal(QString);
之后在subwidget.cpp的槽函数sendSignal()中也发送该信号:
emit backSignal("子窗口请求返回");
在mainwidget.h中声明一个槽函数来响应该信号:
void logSlot(QString);
并在mainwidget.cpp中定义该槽函数, 打印信号传过来的字符串:
void MainWidget::logSlot(QString log)
{
qDebug() << log;
}
因为使用到了qDebug, 所以需要在mainwidget.h中添加头文件:
#include <QDebug>
下面在mainwidget.cpp中建立连接即可:
connect(&subWin, backSignal, this, &MainWidget::logSlot);
如果没有重名信号的话, 这样写是没有问题的, 但是我们现在由两个backSignal信号, 一个不带参数, 一个带参数, 编译器是没办法区分的, 需要我们告诉它, 所以, 删掉那两条信号都是backSignal的connect语句重新建立连接:
void(SubWidget::*backSignal)() = &SubWidget::backSignal; // 我是没有参数的backSignal, 叫backSignal1
connect(&subWin, backSignal, this, &MainWidget::backSlot);
void(SubWidget::*backSigna2)(QString) = &SubWidget::backSignal; // 我是带一个QString参数的backSignal, 叫backSignal2
connect(&subWin, backSigna2, this, &MainWidget::logSlot);
保存后 Ctrl + R运行, 点击Back按钮, 会输出信号发送的字符串:

如果用Qt4的语法的话, 会十分简单:
connect(&subWin, SIGNAL(backSignal()), this, SLOT(backSlot()));
connect(&subWin, SIGNAL(backSignal(QString)), this, SLOT(logSlot(QString)));
但是Qt4这种写法在编译时是不进行错误, 也就是如果你信号和槽函数名字写错了, 也是可以编译通过的. 在运行时才会报错. 而Qt5新写法在编译时就会报错, 所以Qt4更简单Qt5会更安全.
附录
mainwidget.h
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
#include "subwidget.h"
#include <QDebug>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
public slots:
void nextSlot();
void backSlot();
void logSlot(QString);
private:
QPushButton b1;
QPushButton *b2;
SubWidget subWin;
};
#endif // MAINWIDGET_H
mainwidget.cpp
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("Window1");
this->resize(300, 200);
b1.setParent(this);
b1.setText("Close");
b1.move(50, 50);
b2 = new QPushButton(this);
b2->setText("Next");
b2->move(150, 50);
connect(&b1, &QPushButton::clicked, this, &MainWidget::close);
connect(b2, &QPushButton::clicked, this, &MainWidget::nextSlot);
void(SubWidget::*backSignal)() = &SubWidget::backSignal;
connect(&subWin, backSignal, this, &MainWidget::backSlot);
void(SubWidget::*backSigna2)(QString) = &SubWidget::backSignal;
connect(&subWin, backSigna2, this, &MainWidget::logSlot);
/*
connect(&subWin, SIGNAL(backSignal()), this, SLOT(backSlot()));
connect(&subWin, SIGNAL(backSignal(QString)), this, SLOT(logSlot(QString)));
*/
}
void MainWidget::nextSlot()
{
subWin.show();
this->hide();
}
void MainWidget::backSlot()
{
subWin.hide();
this->show();
}
void MainWidget::logSlot(QString log)
{
qDebug() << log;
}
MainWidget::~MainWidget()
{
}
subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = nullptr);
signals:
void backSignal();
void backSignal(QString);
public slots:
void sendSignal();
private:
QPushButton b;
};
#endif // SUBWIDGET_H
subwidget.cpp
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("Windows2");
this->resize(300, 200);
b.setParent(this);
b.setText("Back");
b.move(150, 50);
connect(&b, &QPushButton::clicked, this, &SubWidget::sendSignal);
}
void SubWidget::sendSignal()
{
emit backSignal();
emit backSignal("子窗口请求返回");
}
此文原创禁止转载,转载文章请联系博主并注明来源和出处,谢谢!
作者: Raina_RLN https://www.cnblogs.com/raina/
Qt5教程: (4) 带参数信号与槽的更多相关文章
- QT信号和槽函数学习笔记
//connect 函数有4个参数 分别是 发送者 信号.接受者 ,槽 //connect(sender,signal,receiver,slot) /* * 信号和槽 * 信号 就是一个普通的函数 ...
- Qt5 connect 重载信号和槽
转载文章超哥的经验之谈---Qt5 connect使用之"重载信号和槽" 在Qt4中,关联信号与槽是要使用到SIGNAL()和SLOT()这两个宏. QLabel *label = ...
- Qt源码分析之信号和槽机制
Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...
- Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)
Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...
- Qt 信号槽如何传递参数(或带参数的信号槽)
信号槽如何传递参数(或带参数的信号槽) 利用Qt进行程序开发时,有时需要信号槽来完成参数传递.带参数的信号槽在使用时,有几点需要注意的地 ...
- QT+信号有参数与无参数的实现+QT4和QT5在信号和槽使用上的区别
在QT5中,信号有参数和无参数 #ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushB ...
- Qt带参数的信号和槽
在Qt的开发过程中,信号带参数是很常见的,在使用带参数的信号槽时,有以下几点需要注意. 当信号和槽函数的参数数量相同时,它们的参数类型要完全一致. 信号和槽函数的声明: signals: void i ...
- PyQt Designer中带参数的信号为什么匹配不到带参数的槽函数?
老猿在学习ListView组件时,想实现一个在ListView组件中选中一个选择项后触发消息给主窗口,通过主窗口显示当前选中的项的内容. 进入QtDesigner后,设计一个图形界面,其中窗口界面使用 ...
- Qt5教程: (3) 自定义信号与槽
1. 自定义槽 槽可以是任何成员函数.普通全局函数.静态函数 槽函数和信号的参数和返回值要一致 由于信号是没有返回值的, 槽函数也一定没有返回值 首先在mainwidget.h中添加槽函数: publ ...
随机推荐
- Docker下Jedis体验
jedis是redis的java版本的客户端实现,本文通过一些web请求&响应的实例展示了jedis的基本用法: 开始编码前我们先把环境准备好,总共两个server,对应两个docker容器: ...
- 开发利器JRebel部署SpringBoot项目
不要以为年纪轻轻就跌倒了人生谷底,未来还有更大的下降空间等着你. idea下载和安装JRebel 激活JRebel 访问https://my.jrebel.com/ 使用facebook或twitte ...
- spring boot 配置文件加密数据库用户名/密码
这篇文章为大家分享spring boot的配置文件properties文件里面使用经过加密的数据库用户名+密码,因为在自己做过的项目中,有这样的需求,尤其是一些大公司,或者说上市公司,是不会把这些敏感 ...
- Python集训营45天—Day04 (函数)
目录 1. 函数介绍 2. 函数的参数 3. 模块与函数 4. 递归函数 5. 匿名函数 6. 多返回值 python 的学习已经进入到第四天,前面几章我们已经学会了基本的变量操作,以及分支结构和循环 ...
- sql字段为逗号分开的字符串值的关联查询
1.TREE表: [strID] [int] IDENTITY(1,1) NOT NULL,[strName] [nvarchar](50) NOT NULL, 2.SubInfo CREATE TA ...
- BOM之本地数据存储
JavaScript中本地存储数据常用的,且兼容性较好的有两种方式,cookie和Storage.另外还可以使用location.hash临时存储少量关键信息. 一 location.hash ...
- 【linux】【mysql】mysql主从数据库
系统环境:Centos7 主:192.168.8.162 从:192.168.8.127 前提条件 a.关闭防火墙 systemctl stop firewalld 关闭防火墙开机自启 system ...
- 用git提交新项目到github
1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xb0 in position 279: illegal multibyte sequence
with open(r'E:\yy\mysql.txt') as wk: print(wk.readlines()) Traceback (most recent call last): File & ...
- windows无法安装到这个磁盘怎样解决,及激活
在cmd输入.sql server 2008 slmgr.vbs -ipk KH2J9-PC326-T44D4-39H6V-TVPBY 这个问题遇到的挺多次的,依稀记得上次搞这个问题搞了很久,今天 ...