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 ...
随机推荐
- Python中使用moviepy进行视频分割
场景 moviepy官网: https://pypi.org/project/moviepy/ 是一个用于视频编辑的Python库:切割.连接.标题插入.视频合成.非线性编辑,视频处理和定制效果的创建 ...
- springmvc 事务控制与数据库隔离级别
springmvc 事物传播与数据库隔离控制 http://www.cnblogs.com/yangy608/archive/2011/06/29/2093478.html 一.Propagation ...
- Tomcat类加载器体系结构
<深入理解java虚拟机>——Tomcat类加载器体系结构 标签: java / 虚拟机 / tomcat Tomcat 等主流Web服务器为了实现下面的基本功能,都实现了不止一个自定义的 ...
- 如何更规范化使用MySQL
如何更规范化使用MySQL 背景:一个平台或系统随着时间的推移和用户量的增多,数据库操作往往会变慢:而在Java应用开发中数据库更是尤为重要,绝大多数情况下数据库的性能决定了程序的性能,如若前期埋下的 ...
- 微信小程序删除数组(删除对应指定下标数组中的元素)
.js 使用arr.splice(id,1)删除 // 删除数组中指定下标 dele_time: function (e) { console.log('删除') console.log(e.curr ...
- spring中使用aop配置事务
spring的事务配置有5种方式,这里记录其中的一种:基于tx/aop声明式事务配置 在之前spring aop介绍和示例这篇所附代码的基础上进行测试 一.添加save方法 1.在testDao类里添 ...
- Spark学习之Scala的基础知识
Scala的变量声明 在Scala创建变量的时候,必须使用val或者var val,变量值不可修改,一旦分配不能重新指向别的值 var,分配后,可重新指向类型相同的值 举例 val lines = s ...
- [Leetcode][动态规划] 第931题 下降路径最小和
一.题目描述 给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和. 下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素.在下一行选择的元素和当前行所选元素最多相隔一列. 示 ...
- 搭建第一个node服务器
1.在项目文件夹根目录创建app.js: (1)先引入模块 const http = require('http');//http是安装好node就有的一个模块,是用来创建http服务器的 (2)创建 ...
- jenkins构建maven项目:找不到本地依赖包的解决办法
前言: 我们在构建maven项目时,常常会用到一些特殊的jar包(不能在中央仓库中直接下载到本地仓库如微软不允许以maven的方式直接下载com.microsoft.sqlserver:sqljdbc ...