1 带参数的信号
假设发送的信号带参数
信号是可以重载的,我用同一个函数名称,一个带参数,一个不带参数,在点击“切换到主窗口”按钮的时候,同时发射这两个信号。
subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class Subwidget : public QWidget
{
Q_OBJECT
public:
explicit Subwidget(QWidget *parent = nullptr);
void sendsignal();
signals:
/* 信号必须有signals关键字来声明
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用 emit mysignal();
* 信号可以重载,取同一个名字,只是参数不同而已
*/
void mysignal();
// void mysignal(int a, QString str); // × 声明函数是不用写形参名,只写类型
void mysignal(int, QString); // ▲ 新增的代码
public slots:
private:
QPushButton b;
};
#endif // SUBWIDGET_H
subwidget.cpp
#include "subwidget.h"
Subwidget::Subwidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("子窗口");
b.setParent(this);
b.setText("切换到主窗口");
connect(&b,&QPushButton::clicked,this,&Subwidget::sendsignal);
resize(400,300);
}
void Subwidget::sendsignal(){
emit mysignal();
emit mysignal(250,"我是子窗口"); // 新增的代码
}
信号函数与槽函数的参数和返回值要一致。因此,接收信号的主窗口,需要添加一个带参数的槽函数。
另外,由于mysignal是给重载的信号,存在二义性,所以不能延用原来的方式,需要定义函数指针。
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QPushButton>
#include "subwidget.h"
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
~MyWidget();
void changewin();
void dealsub();
void dealslot(int,QString); // ▲ 新增带参数的槽函数的声明
private:
QPushButton mainwinb;
Subwidget subwin;
};
#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
mainwinb.setParent(this);
mainwinb.setText("切换到子窗口");
mainwinb.move(100,100);
this->setWindowTitle("主窗口");
connect(&mainwinb,&QPushButton::released,this,&MyWidget::changewin);
// connect(&subwin,&Subwidget::mysignal,this,&MyWidget::dealsub);
// mysignal 是 Subwidget这个类自定义的信号
// dealsub 是 MyWidget这个类自定义的槽函数
// ▲ 注意!!!!
// 由于mysignal是重载的,所以存在二义性,在connect函数中不能在使用原来的方式
// 因此需要定义函数指针
// 没参数的mysignal
void (Subwidget::*mysignal_without_para)() = &Subwidget::mysignal;
connect(&subwin,mysignal_without_para,this,&MyWidget::dealsub);
// 有参数的mysignal
void (Subwidget::*mysignal_with_para)(int, QString) = &Subwidget::mysignal;
connect(&subwin,mysignal_with_para,this,&MyWidget::dealslot); // ▲ 新增的槽函数不是重载的,不存在二义性,所以可以延用原来的调用方式
resize(400,300);
}
MyWidget::~MyWidget()
{
}
void MyWidget::changewin(){
// 子窗口显示
subwin.show();
this->hide();
}
void MyWidget::dealsub(){
// 子窗口显示
subwin.hide();
this->show();
}
// ▲ 新增带参数的槽函数定义
void MyWidget::dealslot(int a, QString str){
qDebug() << a << str;
}
运行结果
2 Lambda表达式——槽函数的正确打开方式
Lambda表达式,是C++11增加的新特性。在Qt配合信号一起使用,非常方便
要使用Lambda表达式,项目文件需要添加:CONFIG += C++11。
版本新点的Qt生成项目时自动会生成
Lambda表达式,可以理解成:匿名函数对象
新添加一个按钮来说明Lambda表达式的好处
mywidget.cpp
#include "mywidget.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
mainwinb.setParent(this);
mainwinb.setText("切换到子窗口");
mainwinb.move(100,100);
this->setWindowTitle("主窗口");
connect(&mainwinb,&QPushButton::released,this,&MyWidget::changewin);
// connect(&subwin,&Subwidget::mysignal,this,&MyWidget::dealsub);
// mysignal 是 Subwidget这个类自定义的信号
// dealsub 是 MyWidget这个类自定义的槽函数
// 由于mysignal是重载的,所以存在二义性,在connect函数中不能在使用原来的方式
// 因此需要定义函数指针
// 没参数的mysignal
void (Subwidget::*mysignal_without_para)() = &Subwidget::mysignal;
connect(&subwin,mysignal_without_para,this,&MyWidget::dealsub);
// 有参数的mysignal
void (Subwidget::*mysignal_with_para)(int, QString) = &Subwidget::mysignal;
connect(&subwin,mysignal_with_para,this,&MyWidget::dealslot);
// ▲ 新增代码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)