本文主要是介绍Qt信号槽的两种写法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Qt信号槽connect是什么?
- connect()函数的形式
connect(sender, signal, receiver, slot,type);
- 参数示意
- sender:发出信号的对象
- signal:发送对象发出的信号
- receiver:要接收信号的对象
- slot:接收对象收到信号后调用的函数
- type:连接方式,默认自动auto,可设置成同步Driect或异步Quence等方式,可参考品前文
传统Qt4写法(极度不推荐)
connect(btn_close, SIGNAL(clicked()), this, SLOT(DoCloseSlot()));
不推荐的原因:
- SIGNAL和SLOT两个宏是将函数名称,转换成了字符串,connect连接不成功,不会在编译时后报错,排查问题困难
- 槽函数必须定义在slot宏下
public:void DoCloseSlot();//错误,连接失败,没有注册元对象
public slot:void DoCloseSlot();//成功
- 槽函数在slot下,但参数不匹配,仍然连接失败,无法编译时报错
//xxx.h
signals:void testMocSignal(int input,int in2);
protected slots:void DoCloseSlot(QString a,QString b);
//xxx.cpp
connect(this, SIGNAL(testMocSignal(int,int)), this, SLOT(DoCloseSlot(QString,QString)));
//编译时不报错,运行时输出:/*
QObject::connect: Incompatible sender/receiver argumentsTestMoc::testMocSignal(int,int) --> TestMoc::DoCloseSlot(QString,QString)
*/
但下面这种情况可以响应槽函数
//xxx.h
signals:void testMocSignal(int in1,int in2);void testMocSignal2();void testMocSignal3(int in1);
protected slots:void DoCloseSlot();void DoCloseSlot2(int in1,int in2);void DoCloseSlot3(int in1,int in2=999);void DoCloseSlot4(int in1=999,int in2=999);
//xxx.cpp //可以正常响应,连接成功
connect(this, SIGNAL(testMocSignal(int,int)), this, SLOT(DoCloseSlot()));
//无法响应,连接失败
connect(this, SIGNAL(testMocSignal2()), this, SLOT(DoCloseSlot2(int,int)));
//可以正常响应,连接成功,槽函数缺省值有默认参数
connect(this, SIGNAL(testMocSignal3(int)), this, SLOT(DoCloseSlot3(int)));
//无法响应,连接失败,无法找到匹配的testMocSignal3信号
connect(this, SIGNAL(testMocSignal3()), this, SLOT(DoCloseSlot4()));
/*
DoCloseSlot 可以正常响应,反之却不可以;
最简单的理解,因为调用槽函数的参数缺一不可
*/
综上所述: Qt4的连接方式最大的缺点就是编译时无法报错,在运行期间才会验证是否正确,这对于C++ 这种静态语言,简直就是毁灭
Qt5 仿函数写法(强推,务必)
signals:void testMocSignal(int in1,int in2);void testMocSignal2();void testMocSignal3(QString str);
protected slots:void DoCloseSlot(int in1,int in2);
protect:void DoCloseSlot2();void DoCloseSlot3(int in);
//连接成功
connect(this, &TestMoc::testMocSignal, this, &TestMoc::DoCloseSlot);
//连接失败,参数个数不匹配
connect(this, &TestMoc::testMocSignal2, this, &TestMoc::DoCloseSlot);
//连接失败,参数类型不匹配
connect(this, &TestMoc::testMocSignal3, this, &TestMoc::DoCloseSlot3);
//连接失败,参数个数不匹配
connect(this, &TestMoc::testMocSignal, this, [this](){qDebug()<< __FUNCTION__ ;
});
//连接成功
connect(this, &TestMoc::testMocSignal, this, [this](int in1,int in2){qDebug()<< __FUNCTION__ << in1 << in2;
});
//连接成功,带有默认参数
connect(this, &TestMoc::testMocSignal, this, [this](int in1, int in2,int in3=999) {qDebug() << __FUNCTION__<<in1<<in2<<in3;
});
直接摆优点:
- 严格的信号槽参数匹配校验,可以在编译期就避免很多问题
- 槽函数不在限定必须是slot,可以是普通函数,类成员函数,甚至是lambda表达式
这篇关于Qt信号槽的两种写法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!