在Qt5.0之后,QObject::connect在String-Based的基础上增加了Functor-Base形式的语法,他们之间的区别主要如下:
基于字符串的基于函数的类型检查完成时间运行时编译时是否可以隐式转换否是支持信号连接至Lambda否是支持槽参数大于信参数(通过默认参数)是否支持C++函数连接至QML函数是否下面将对上述几个方面进行解释:
一、类型检查和隐式转换String-based类型的连接将会在运行时对比字符串来完成检查,这样有三个限制:
- 只有当程序运行时才能检查到错误
- 隐式转换无法用在信号和槽
- typedef和namespace无法被解析
后两者不可行的原因是,string比较器无法获知C++真正的类型,所以需要严格的字符串匹配。
auto slider = new QSlider(this);
auto doubleSpinBox = new QDoubleSpinBox(this);
// OK: The compiler can convert an int into a double
connect(slider, &QSlider::valueChanged,
doubleSpinBox, &QDoubleSpinBox::setValue);
// ERROR: The string table doesn't contain conversion information
connect(slider, SIGNAL(valueChanged(int)),
doubleSpinBox, SLOT(setValue(double)));
二、连接Lambda表达式
class TextSender : public QWidget {
Q_OBJECT
QLineEdit *lineEdit;
QPushButton *button;
signals:
void textCompleted(const QString& text) const;//发送一个QString参数信号
public:
TextSender(QWidget *parent = nullptr);
};
TextSender::TextSender(QWidget *parent) : QWidget(parent) {
lineEdit = new QLineEdit(this);
button = new QPushButton("Send", this);
connect(button, &QPushButton::clicked, [=] {
emit textCompleted(lineEdit->text());//虽然QPushButton的clicked信号是无参的,但是通过Lambda捕获可以发送一些额外的信息,如这里的QString.
});
}
注意:虽然Functor-based类型的连接中函数指针可以是包含普通函数(包括成员函数)的任意类型,但是为了可读性,最好是slots Lambda表达式或者signals中的一种。
三、连接C++对象至QML对象不了解QML,略
四、在slots中使用默认参数连接更少参数的信号一般来说,信号参数和槽参数个数是相等的,当然你可以发送多点信号给我,槽可以不接收,但是一般不能少发信号。
public slots:
void printNumber(int number = 42) {
qDebug()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?