当前位置 博文首页 > liuguangshibei的博客:QT学习——day5
1.信号函数:在信号函数对应类的signals下添加信号函数重载的声明。
signals:
void girlfriend();//原函数
void girlfriend(QString);//重载的函数
2.槽函数重载:在槽函数对应类的public slots下添加槽函数的重载声明。
public slots:
void eat();
void eat(QString);
在对应的.cpp文件中添加重载函数的定义:
void Me::eat(QString)
{
qDebug()<<"这是一个重载的输出!!!";
}
注意重载槽函数的参数与信号函数参数的关系。
法<1> 使用额外定义的一个信号发射函数,在此函数中添加重载的信号函数发射事件。
void Mywidget::launch()//额外自定义的信号发射函数
{
emit fir->girlfriend();//原信号发射事件
emit fir->girlfriend("这是一个重载的信号函数!!!");//重载的信号发射事件
}
这样只需将触发事件与发射函数connect连接一次。
connect(ui->f_eat,&QPushButton::clicked,this,&Mywidget::launch);
法<2> 直接将connect连接中的第二对参数改为要发射的信号函数。
需将触发事件与发射函数连接两次(原函数一次重载函数一次)。
<1> QT5中的信号连接方法:
//QT5的连接机制:
//因为重载后的函数地址会发生变化,同一个函数名会对应多个地址,故需要不同参数函数的地址进行再定义
//void(函数属于的类名+域作用符+自定义的*指针)(该函数对应的参数类型)=函数的地址
void(Friend::*fr1)()=&Friend::girlfriend;
void(Friend::*fr2)(QString)=&Friend::girlfriend;
void(Me::*m_e1)()=&Me::eat;
void(Me::*m_e2)(QString)=&Me::eat;
//使用connect进行对应的连接
connect(fir,fr1,e,m_e1);
connect(fir,fr2,e,m_e2);
connect(fir,fr2,e,m_e1);
connect连接法制为:空对空,有对空,有对有。
利:这种连接方法没有用到底层的宏替换,故编译器会提示报错信息。
弊:需要重新定义每一个重载函数的地址,过程较为繁琐。
<2> QT4中的信号连接方法:
//统一将类实例化
fir=new Friend;
e=new Me;
connect(fir,SIGNAL(girlfriend()),e,SLOT(eat()));//原函数的连接
connect(fir,SIGNAL(girlfriend(QString)),e,SLOT(eat(QString)));//重载函数的连接
利:这种方法连接相对比较简单,代码简洁。
弊:这种方法在底层是采用在SIGNAL与SLOT中宏替换的方式,故在书写其中参数时类似与重新定义变量,编译器不会提供检错机制,当然更不会有快捷补全,故比较容易出错。
Lambda表达式就是一个匿名函数, 语法格式如下:
capture opt -> ret {body;};
? capture: 捕获列表
// 示例代码->匿名函数的调用:
int ret = [](int a) -> int
{
return a + 1;
}(100);
#include <iostream>
#include<string>
using namespace std;
int main()
{
int a = 2;
auto m = [=]()mutable {
cout << "我是一个lambda表达式!!!" << endl;
return a + 1;
};//可以使用auto关键字进行定义与调用
cout << m();//类似与普通函数的调用
return 0;
}//mutable该关键字表示捕获的变量可以在表达式内部进行读写操作。
对于lambda的返回值,若函数体内只有一个return语句,则可以不进行显示的指定返回值类型,编译器会自动根据return的值进行判断,若没有return则返回值类型会默认为void,若函数体内有多个return语句,则必须要显示的指定返回值类型。
connect(ui->f_eat,&QPushButton::clicked,this,[=](){
emit fir->girlfriend();
emit fir->girlfriend("这是一个重载信号函数的输出!!!");
});
cs