Qt自定义信号、带参数的信号、lambda表达式和信号的使用
整个部分知识通过一个跳转窗口的项目来体现
第一个页面
#include "test.h"
#include <qdebug.h>
test::test(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
/*
* &s 信号发出者
* &subWidget::mySignals 处理的信号, &发送者类名::槽函数
* this信号接收者
* &test::onSubcliked 信号处理函数、槽函数 &接收者类名::槽函数
*/
//函数指针
// void(subWidget:: * mySignals)() = &subWidget::mySignals;
// connect(&s,mySignals,this,&test::onSubcliked);
// void(subWidget:: *mySignals1)(int,QString) = &subWidget::mySignals;
// connect(&s, mySignals1, this, &test::displsy);
//槽函数必须有slots关键字修饰
//this :类中所有成员以值传递方式
//&:把外部所有局部变量,引用符号
connect(&s, SIGNAL(mySignals()), this, SLOT(onSubcliked()));
connect(&s, SIGNAL(mySignals(int,QString)), this, SLOT(displsy(int, QString)));
connect(ui.pushButton, &QPushButton::clicked, this, &test::on_pushButton_cliked);
//lambda表达式 匿名函数对象
//配合信号使用方便
connect(ui.pushButton_3, &QPushButton::clicked,
// = :把外部所有的局部变量、类中所有成员以值传递方式
//mutable可变的 [=]() mutable
[=](bool isCheck)
{
ui.pushButton_3->setText("123");
qDebug() << "dadasa";
qDebug() << isCheck;
});
}
test::~test()
{}
void test::on_pushButton_cliked()
{
this->hide();
s.show();
}
void test::onSubcliked()
{
this->show();
s.hide();
}
void test::displsy(int num, QString s)
{
qDebug() << num << s;
}
.h文件
#pragma once
#include <QtWidgets/QDialog>
#include "ui_test.h"
#include "subWidget.h"
class test : public QDialog
{
Q_OBJECT
public:
test(QWidget *parent = nullptr);
~test();
void on_pushButton_cliked();
//槽函数
private slots:
void onSubcliked();
void displsy(int num, QString s);
private:
Ui::testClass ui;
subWidget s;
};
第二个页面
#include "subWidget.h"
subWidget::subWidget(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
//将按钮和方法链接
connect(ui.pushButton,&QPushButton::clicked,this,&subWidget::on_pushButton_cliked);
connect(ui.pushButton_2, &QPushButton::clicked, this, &subWidget::on_pushButton2_cliked);
}
subWidget::~subWidget()
{}
void subWidget::on_pushButton_cliked()
{
emit mySignals();
}
void subWidget::on_pushButton2_cliked()
{
emit mySignals(1,"发发大");
}
.h文件
#pragma once
#include <QDialog>
#include "ui_subWidget.h"
class subWidget : public QDialog
{
Q_OBJECT
public:
subWidget(QWidget *parent = nullptr);
~subWidget();
void on_pushButton_cliked();
void on_pushButton2_cliked();
signals:
/*
* 信号必须有signals关键字声明
* 信号灭有返回值,但是可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用:emit mySignals
*/
void mySignals();
void mySignals(int num, QString s);
private:
Ui::subWidgetClass ui;
};
跳转到子页面
点击显示内容 就会打印
点击返回主页面
点击lambda表达式