(8)Qt中的自定义信号

简介: 本文介绍了如何在Qt框架中创建和使用自定义信号,并通过一个父子窗口切换的示例来展示自定义信号的实现和应用。

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()
{

}

实现的效果

相关文章
|
3天前
|
编译器
(9)Qt中信号与槽重载的解决方案
本文介绍了在Qt中处理信号与槽重载问题的三种解决方案:使用函数指针、Qt提供的QOverload类和Qt4的宏方式。
20 3
|
3天前
(7)Qt中的自定义槽(函数)
这篇文章介绍了在Qt中如何定义和使用自定义槽函数,包括类成员函数、静态类成员函数、全局函数和lambda表达式作为槽函数的示例,以及使用lambda表达式时的注意事项。
9 2
(7)Qt中的自定义槽(函数)
|
2月前
|
程序员 C++
【Qt】信号与槽(下)
【Qt】信号与槽(下)
|
2月前
|
Linux C++
【Qt】信号与槽(上)
【Qt】信号与槽(上)
【Qt】信号与槽(上)
|
2月前
|
搜索推荐 C++
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
48 4
|
2月前
【qt】有点意思的信号与槽
【qt】有点意思的信号与槽
16 0
|
2月前
【qt】QTcpSocket相关的信号
【qt】QTcpSocket相关的信号
11 0
|
2月前
【qt】自定义对话框(2)
【qt】自定义对话框(2)
20 0
|
2月前
【qt】自定义对话框(1)
【qt】自定义对话框(1)
18 0
|
4月前
|
C++
Qt信号和槽
Qt信号和槽