信号可以重载
这里,重载mySignal这个函数,并带有两个参数。
在subwidget.h中

// signals是Qt中特有的关键字,最终会转化成C++中语法样式。
signals:
    /* 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用时:emit mySignal();
     * 信号可以重载
    */

    void mySignal();
    void mySignal(int,QString);
    //重载mySignal这个函数,带有两个参数,QString相当于C++中的String,只不过功能会更强一些。

然后这两个信号都可通过 subwidget.cpp 中的自定义槽函数 sendSlot 发送出去。

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("小弟");
    b.setParent(this);//指定当前窗口为父对象
    b.setText("切换到主窗口");

    connect(&b,&QPushButton::clicked,this,&SubWidget::sendSlot);
    this->resize(400,400);
}

void SubWidget::sendSlot()
{
     emit mySignal();
     emit mySignal(250,"我是子窗口");
}

当主窗口对象接收到子串口发送过来的信号,并且想要进行相应的处理的时候就可以使用connect函数进行将两者关联。

在mainwidget.cpp中

connect(&subw,&SubWidget::mySignal,this,&MainWidget::changeSubWindow);
connect(&subw,&SubWidget::mySignal,this,&MainWidget::dealSubWindow);

但是如果直接这样操作将会产生二义性。
因此,我们需要分别定义一个函数指针来指向它们,此外,在定义的时候还需要加上作用域。

// 如果直接使用函数名,将会产生二义性
    // 因此需要分别定义一个函数指针来指向它们,此外,在定义的时候还需要加上作用域
    void (SubWidget::*funSignal)() = &SubWidget::mySignal;
    // 处理子窗口发送过来的信号。
    connect(&subw,funSignal,this,&MainWidget::changeSubWindow);

    void (SubWidget::*printSignal)(int,QString)= &SubWidget::mySignal;
    // 处理子窗口发送过来的信号。
    connect(&subw,printSignal,this,&MainWidget::dealSubWindow);

这里的自定义槽函数changeSubWindow的功能是:
主窗口显示,子窗口隐藏

dealSubWindow的功能是:
打印参数–看看参数是不是真的传过来了

void MainWidget::changeSubWindow()
{
    //主窗口显示,子窗口隐藏
    subw.hide();
    this->show();
}

void MainWidget::dealSubWindow(int a,QString str)
{
    // 打印参数--看看参数是不是真的传过来了
    // 需要添加一个头文件#include <QDebug>
    // 与C++中的输出函数cout用法一样
    qDebug() << a << str;
}

这两个槽函数定义好之后,还要记得在mainwidget.h中进行声明。

上述定义多个函数指针的方法是有一点麻烦的,而在QT4中的信号连接是相对简单一些的。可以进行选择不同的信号。

qt的destroyed信号_qt的destroyed信号


但是,也有局限性。

qt的destroyed信号_开发语言_02


就是槽函数在声明的时候都必须使用slots关键字来进行修饰,同时还要添加权限。

在mainwidget.h中

public slots:
    void mySlot();
    void changeWindow();
    void changeSubWindow();
    void dealSubWindow(int,QString);

但是,使用Qt4这种方式容易出错,比如
这里的槽函数changeSubWindow和dealSubWindow没有加括号,也不会报错,程序正常运行。
因为,SIGNAL和SLOT会将函数名称转化为字符串,也就不进行错误检测了。

connect(&subw,SIGNAL(mySignal()),this,SLOT(changeSubWindow));
connect(&subw,SIGNAL(mySignal(int,QString)),
             this,SLOT(dealSubWindow));

应该写成

connect(&subw,SIGNAL(mySignal()),this,SLOT(changeSubWindow()));
connect(&subw,SIGNAL(mySignal(int,QString)),
             this,SLOT(dealSubWindow(int,QString)));

所以,当工程文件非常大的时候,使用Qt5的方式更保险一些。