首先看示例代码:
QPushButton *button = new QPushButton("Click me");
connect(button, &QPushButton::clicked, [=]() {
QMessageBox::information(nullptr, "Button clicked", "You clicked the button!");
});
在上面的代码中,使用 QPushButton
的clicked
来展示lambda表达式在connect
函数中的应用,并当用户点击按钮时,将触发 clicked
信号,进而调用 lambda 表达式中的代码。
这里,在 lambda 表达式中更改 []中的符号来改变变量的引用,[=]表示引用上下文中所有变量(仅当前lambda表达式作用区域),使用[&]
可以获所有变量,或者指定要捕获的变量。使用[&]和指定对象的例子:
int counter = 0;
QPushButton *button1 = new QPushButton("Increment counter");
QPushButton *button2 = new QPushButton("Show counter");
connect(button1, &QPushButton::clicked, [&]() {
counter++;
});
connect(button2, &QPushButton::clicked, [counter]() {
QMessageBox::information(nullptr, "Counter", QString::number(counter));
});
为了更直观的理解捕获指定变量以及作用区域的意思,下面举例一个在头文件中使用lambda表达式指定捕获成员变量的例子:
#include <QObject>
#include <QPushButton>
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass() {
connect(button, &QPushButton::clicked, [this]() {
this->counter++;
});
}
private:
int counter = 0;
QPushButton *button = new QPushButton("Increment counter");
};
以上就是我所知道的lambda表达式再QT中比较常用的作为槽函数的使用方式。