Qt框架提供的信号在某些特定场景下是无法满足我们的项目需求的,因此我们还设计自己需要的的信号,同样还是使用connect()对自定义的信号槽进行连接。
自定义信号需要遵循的规则
信号是类的成员函数,并且返回类型必须是 void 类型
信号函数只需要声明, 不需要定义(没有函数体实现)
参数可以随意指定, 信号也支持重载
信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
在程序中发送自定义信号: 发送信号的本质就是调用信号函数
信号的发送
emit mysignals(); //发送信号
emit是一个空宏,没有特殊含义,仅用来表示这个语句是发射一个信号,可以不写,但是不推荐。信号参数的作用是数据传递, 谁调用信号函数谁就指定实参,实参最终会被传递给槽函数。
自定义信号的基本实现
使用一个父子窗口切换的小案例
父窗口代码
#ifndef _WIDGET_H_
#define _WIDGET_H_
#include <QWidget>
#include <QPushButton>
#include "SubWidget.h"
class SubWidget;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget* parent = nullptr);
~Widget();
private:
QPushButton* m_btn = nullptr;
SubWidget* m_subWidget = nullptr;
};
#endif
#include"Widget.h"
Widget::Widget(QWidget* parent)
:QWidget(parent)
{
resize(640, 480); // 设置父窗口大小
setWindowTitle("父窗口"); // 设置父窗口标题
m_btn = new QPushButton("切换到子窗口", this);
m_subWidget = new SubWidget;
//实现从父窗口切换到子窗口的效果
connect(m_btn, &QPushButton::clicked,[=]() {
this->hide();
m_subWidget->show();
});
//实现从子窗口切换到父窗口的效果
connect(m_subWidget, &SubWidget::openMainWindow, [=]() {
this->show();
m_subWidget->hide();
});
}
Widget::~Widget()
{
}
子窗口代码
#ifndef _SUBWIDGET_H_
#define _SUBWIDGET_H_
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
SubWidget(QWidget* parent = nullptr);
~SubWidget();
private:
QPushButton* m_btn;
signals:
void openMainWindow(); // 自定义信号
};
#endif
#include "SubWidget.h"
SubWidget::SubWidget(QWidget* parent)
:QWidget(parent)
{
resize(400, 400);
setWindowTitle("子窗口");
m_btn = new QPushButton("切换到父窗口", this);
//信号关联信号的方式发送信号
//connect(m_btn, &QPushButton::clicked, this, &SubWidget::openMainWindow);
//使用emit发送信号
connect(m_btn, &QPushButton::clicked, this, [=](){
emit openMainWindow();
});
}
SubWidget::~SubWidget()
{
}
实现的效果