在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) 带参数信号与槽的更多相关文章

  1. QT信号和槽函数学习笔记

    //connect 函数有4个参数 分别是 发送者 信号.接受者 ,槽 //connect(sender,signal,receiver,slot) /* * 信号和槽 * 信号 就是一个普通的函数 ...

  2. Qt5 connect 重载信号和槽

    转载文章超哥的经验之谈---Qt5 connect使用之"重载信号和槽" 在Qt4中,关联信号与槽是要使用到SIGNAL()和SLOT()这两个宏. QLabel *label = ...

  3. Qt源码分析之信号和槽机制

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...

  4. Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...

  5. Qt 信号槽如何传递参数(或带参数的信号槽)

                                    信号槽如何传递参数(或带参数的信号槽) 利用Qt进行程序开发时,有时需要信号槽来完成参数传递.带参数的信号槽在使用时,有几点需要注意的地 ...

  6. QT+信号有参数与无参数的实现+QT4和QT5在信号和槽使用上的区别

    在QT5中,信号有参数和无参数 #ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushB ...

  7. Qt带参数的信号和槽

    在Qt的开发过程中,信号带参数是很常见的,在使用带参数的信号槽时,有以下几点需要注意. 当信号和槽函数的参数数量相同时,它们的参数类型要完全一致. 信号和槽函数的声明: signals: void i ...

  8. PyQt Designer中带参数的信号为什么匹配不到带参数的槽函数?

    老猿在学习ListView组件时,想实现一个在ListView组件中选中一个选择项后触发消息给主窗口,通过主窗口显示当前选中的项的内容. 进入QtDesigner后,设计一个图形界面,其中窗口界面使用 ...

  9. Qt5教程: (3) 自定义信号与槽

    1. 自定义槽 槽可以是任何成员函数.普通全局函数.静态函数 槽函数和信号的参数和返回值要一致 由于信号是没有返回值的, 槽函数也一定没有返回值 首先在mainwidget.h中添加槽函数: publ ...

随机推荐

  1. 致初学者(三): HDU 2033~ 2043题解

    下面继续给出HDU 2033~2043的AC程序,供大家参考.2033~2043这10道题就被归结为“ACM程序设计期末考试(2006/06/07) ”和“2005实验班短学期考试 ”. HDU 20 ...

  2. [币严区块链]BitcoinCash - BCH钱包地址生成与扫块充值监控(JAVA版)

    本文的方案无需自建节点,因为BCH当前区块数据大小已经达到200G以上,BTC区块数据也已超过300G,若每个币都自建节点,对云服务器的消耗会非常大. 认识BitcoinCash(BCH) Bitco ...

  3. vue 页面跳转传参

    页面之间的跳转传参,正常前端js里写 window.location.href="xxxxx?id=1" 就可以了: 但是vue不一样 需要操作的是路由history,需要用到 V ...

  4. FreeSql (三)实体特性

    主键(Primary Key) class Topic { [Column(IsPrimary = true)] public int Id { get; set; } } 约定: 当没有指明主键时, ...

  5. java8中字符串常量以及GC相应处理机制

    目录 1,常量池 1.1, class文件常量池 1.2, 运行时常量池 1.3,字符串常量池 String.intern() -XX:StringTableSize 2,使用new关键字和使用字符串 ...

  6. 使用JAVA API获取hadoop集群的FileSystem

    所需要配置的参数:  Configuration conf = new Configuration();   conf.set("fs.defaultFS", "hdfs ...

  7. 配置hibernate访问mysql

    在之前搭建spring mvc项目这篇的基础上继续集成,引入hibernate支持 一.添加jar包引用 修改pom.xml文件,加入: <dependency> <groupId& ...

  8. php将图片存储在阿里云oss存储上

    创建两个方法 1.上传方法 use OSS\OssClient; use think\Config; use OSS\Core\OssException; /** * 存储文件 * * @param ...

  9. php下api接口的并发http请求

    php下api接口的并发http请求 ,提高app一个页面请求多个api接口,页面加载慢的问题: func_helper.php/** * 并发http请求 * * [ * 'url' //请求地址 ...

  10. java、python、MYSQL环境安装

    JAVA的环境变量:变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;        变量名:JAVA_HOME python的环境变量:变量值:    %PY_HOME ...