QT学习(五)——从子窗口传来多个信号(带参数的自定义信号)

同样是两个窗口,主窗口与副窗口,给副窗口自定义两个重载的信号,传给主窗口处理

 void mySignals();
 //信号可以重载
 void mySignals(int,QString);

由被关联的按钮发送消息,并送出两条消息给主窗口

emit mySignals();
emit mySignals(520,"I Love You!");

主窗口中处理消息的两个槽函数

 //处理子窗口发送的第一个信号
 void resume();
 //处理子窗口发送的第二个信号,记住信号的返回值与参数和槽函数一定要一致
 void realSub(int,QString);

主窗口处理两个消息

//处理从子窗口发射来的第一个信号
 connect(&son,&otherWidget::mySignals,this,&Widget::resume);
 //处理从子窗口发射来的第二个信号
 connect(&son,&otherWidget::mySignals,this,&Widget::realSub);

开始编译

会报错!!因为两个信号重名,但是编译器不知道使用哪一个就会发生编译阶段的错误

----------------------------------------------------------------------------------------------------------------------

解决办法:函数指针

//处理从子窗口发射来的第一个信号
 void(otherWidget::*funtion_p1)()=&otherWidget::mySignals;//设定了一个函数指针,
 connect(&son,funtion_p1,this,&Widget::resume);
 //处理从子窗口发射来的第二个信号
 void(otherWidget::*funtion_p2)(int ,QString)=&otherWidget::mySignals;//BUG出现点,在对函数指针赋值的时候,后面的mySignals是不能够带参数的
 connect(&son,funtion_p2,this,&Widget::realSub);

 

----------------------------------------------------------------------------------------------------------------------------

QT中打印

#include<QDebug>//打印

qDebug()<<a<<str;

如果想要打印中文

qDebug()<<a<<str.toUtf8().data();

------------------------------------------------------------------------------------------------------------------------------

第二种解决方法

//QT4信号连接
//QT4槽函数必须要有关键字slots来修饰
connect(&son,SIGNAL(mySignals()),this,SLOT(resume()));
connect(&son,SIGNAL(mySignals(int,QString)),this,SLOT(realSub(int,QString)));

如果使用这种方法,那么我们需要修改槽函数的头文件

public slots://QT4的信号链接方法,必须对槽函数进行声明
//槽函数
void Get_to();
void changeWin();//在主窗口类中实现这个成员槽函数,是因为当主窗口向父窗口转换时,是主窗口类来调用函数,而且此时也只有主窗口包含一个成员父窗口对象
 //处理子窗口发送的第一个信号
void resume();
 //处理子窗口发送的第二个信号,记住信号的返回值与参数和槽函数一定要一致
 void realSub(int,QString);

采用这种方法的弊端就是:

QT4这种信号连接的方式被淘汰的原因是,SIGNAL和SLOT是两个宏,会把函数转换为字符串,

不进行错误检查,从而在运行阶段造成错误,程序出现BUG,

 最好是在编译阶段报错,可以更好的完善程序

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页