Lambda表达式是C++11增加的新特性,Qt配合信号一起使用,非常方便。
Qt使用Lambda表达式,需要在 .pro项目文件中:CONFIG += c++11(我的Qt5.12.9,刚创建好的工程中会自动加入,不需要手动添加)
= :把外部所有局部变量、类中所有成员以值传递方式传参
日常使用,只需要会=这一种方式即可:
[=]()
{
}
示例:使用Lambda表达式,使信号关联一个事件,点击按钮,让按钮文字变化。
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPushButton> class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private: QPushButton btn1; }; #endif // WIDGET_H
widget.cpp
#include "widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) { btn1.setParent(this); btn1.setText("clickHere!"); btn1.resize(80, 25); btn1.move(100, 100); resize(320, 240); setWindowTitle("Hello"); // Lambda表达式,匿名函数对象 // C++11增加的新特性,.pro项目文件: CONFIG += c++11 // Qt配合信号一起使用,非常方便 // = :把外部所有局部变量、类中所有成员以值传递方式传参 // 因为是值传递,变量为只读,赋值无用。可以加mutable // &:把外部所有局部变量,引用符号,容易出错 // 括号里可以传递参数,参数为信号动作,很少用这个东西 connect(&btn1, &QPushButton::clicked, [=]() { btn1.setText("Done!"); }); } Widget::~Widget() { }
现象:
- 点击 "clickHere!",按钮文字会变为 "Done!"。信号正常触发了事件。