connect函数在qt中作为连接信号和槽的函数,并不陌生。它目前有以下3种写法:
1、使用SIGNAL和SLOT宏
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(onPushButtonClicked()));
2、使用&类名::函数名
connect(ui->pushButton_2,&QPushButton::clicked,this,&Widget::onSetBlockedSignalStatus);
3、Lambda表达式,关联后直接编写信号发射后要执行的代码。不需要定义槽函数。
connect(ui->pushButton,&QPushButton::clicked,[=](void){
ui->label->setText("Hello Qt");
}
);
使用SIGNAL和SLOT宏是Qt4的写法,在Qt5中不仅支持使用SIGNAL和SLOT宏的写法,也支持使用&类名::函数名的写法。使用使用&类名::函数名的写法有以下几个好处:
1、不需要写参数更简便。
2、不需要槽函数的参数类型与信号对应的参数类型完全一致,只需要进行隐藏式转换。
3、可以在编译时进行检查,比如信号或槽函数的拼写错误、槽函数参数数量多于信号的参数数量等都能在编译时期发现,而不是运行时。
就如一些qt的书所言:建议在编写Qt5的代码时使用&类名::函数名的connect方式。
demo:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(this->ui->pushButton,&QPushButton::clicked,[=](void){
emit sigSendArgs("ip","port");
});
connect(this,SIGNAL(sigSendArgs(QString,QString)),SLOT(onSendArgs(QString,QString,QString)));
//connect(this,&Widget::sigSendArgs,this,&Widget::onSendArgs1);
}
Widget::~Widget()
{
delete ui;
}
void Widget::onSendArgs(QString a, QString b)
{
qDebug()<<"a:"<<a<<"b:"<<b;
}
void Widget::onSendArgs1(QString, QString, QString)
{
}
1、sigSendArgs与onSendArgs的参数不一致,但是编译的时候却并没有发现,直到运行才看到日志打印。
2、如果使用connect(this,&Widget::sigSendArgs,this,&Widget::onSendArgs1);的方式在编译期间就会提示参数不一致的问题。
3、 当我们使用SIGNAL的写法connect一个并不存在的槽函数时,编译器并没有提示。但是如果使用类名的方式,编译就会提示错误:
//connect(this,SIGNAL(sigSendArgs(QString,QString)),SLOT(onSendArgs2(QString,QString)));
connect(this,&Widget::sigSendArgs,this,&Widget::onSendArgs2);