信号可以重载
这里,重载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中的信号连接是相对简单一些的。可以进行选择不同的信号。
但是,也有局限性。
就是槽函数在声明的时候都必须使用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的方式更保险一些。