一、Lambda表達式簡介
Lambda表達式是C++11中的新特性,它是一種能夠捕獲上下文中變數,從而能夠在運行時創建匿名函數的方法。Lambda表達式背後的思想是,允許我們在刻畫一個函數的同一處,同時制定這個函數所操作的數據。相比於傳統的函數指針,Lambda表達式具有更好地可讀性和更靈活的能力。
在Qt編程中,Lambda表達式的使用非常廣泛,被用於對已有的元素進行操作、遍歷集合等等,Qt中的許多函數都接受Lambda表達式作為參數。
二、Qt Lambda表達式的語法
Qt Lambda表達式的形式如下:
[capture list] (parameters) mutable/specifier -> return type { statement }
其中,capture list、parameters、mutable/specifier和return type都是可選的。
下面是一個簡單的示例:
auto func = [] (int a, int b) -> int {
return a + b;
};
此Lambda表達式為一個接受兩個int參數並返回int的函數,將兩個參數相加。
三、Qt Lambda表達式的用途
1.用Lambda表達式進行信號槽的連接
在Qt中,我們可以使用Lambda表達式來連接信號和槽。例如:
connect(button, &QPushButton::clicked, this, [] () {
qDebug() << "Button clicked";
});
上述代碼展示了如何在QPushButton的clicked信號和一個Lambda表達式之間連接槽。當按鈕被點擊時,連到這個槽的Lambda表達式會執行。
2.使用Lambda表達式遍歷容器
另一個使用Lambda表達式的常見場景是遍歷容器。我們可以通過Qt中的foreach()函數完成對容器的遍歷,例如:
QVector<int> intVec {1, 2, 3};
foreach(int i, intVec) {
qDebug() << i;
}
上述代碼展示了如何使用foreach()函數遍歷一個整數向量。
我們還可以使用Qt的STL容器適配器中的C++11範圍for循環語法,例如:
QVector<int> intVec {1, 2, 3};
for (const auto& i : intVec) {
qDebug() << i;
}
上述代碼同樣可以完成與前面相同的效果。
3.使用Lambda表達式進行線程式控制制
在Qt中,我們可以使用Lambda表達式在線程中運行任務,例如:
QThread* thread = new QThread;
connect(thread, &QThread::started, [this] () {
qDebug() << "Thread started";
});
connect(thread, &QThread::finished, [this] () {
qDebug() <start();
上述代碼展示了如何創建一個新線程並在線程中執行Lambda表達式。
四、Qt Lambda表達式的捕獲列表和可變要求
1.捕獲列表
在使用Lambda表達式時,捕獲列表指定Lambda表達式中應該「捕獲」哪些變數。例如:
int a = 1;
auto func = [a] () {
qDebug() << "a is " << a;
};
上述代碼展示了如何捕獲變數a並在Lambda表達式中使用它。
在捕獲列表中,可以使用以下兩種方式進行捕獲:
1.值捕獲
int a = 1;
auto func1 = [a] () mutable {
a++;
qDebug() << "a is " << a;
};
auto func2 = [] (int a) {
qDebug() << "a is " << a;
};
在上述代碼中,func1和func2分別使用了值捕獲。在func1中,使用了mutable關鍵字,允許我們修改值捕獲的變數;在func2中,我們將a作為參數傳遞給Lambda表達式。
2.引用捕獲
int a = 1;
auto func = [&a] () mutable {
a++;
qDebug() << "a is " << a;
};
在上述代碼中,使用了引用捕獲。Lambda表達式中捕獲的是變數a的引用,因此在表達式中修改它也會反映到原變數的值上。
2.可變要求
使用mutable關鍵字可以將捕獲的變數變成可變的,允許我們在Lambda表達式中修改它。默認情況下,變數是不可修改的。例如:
int a = 1;
auto func = [a] () mutable {
a++;
qDebug() << "a is " << a;
};
在上述代碼中,使用了mutable關鍵字,允許我們在Lambda表達式中修改變數a的值。
五、總結
Qt Lambda表達式的使用方式非常靈活,不僅可以用於信號槽的連接、容器的遍歷,還可以在多線程編程中使用。捕獲列表和可變要求為Lambda表達式帶來了更高的可定製性,並且代碼的可讀性更強。
六、完整代碼示例
下面是一個使用Qt Lambda表達式的完整示例:
#include <QtGlobal>
#include <QDebug>
#include <QVector>
#include <QThread>
void connectButton();
void traverseVector();
void runInThread();
int main(int argc, char *argv[])
{
Q_UNUSED(argc);
Q_UNUSED(argv);
connectButton();
traverseVector();
runInThread();
return 0;
}
void connectButton()
{
QPushButton* button = new QPushButton("Click me!");
connect(button, &QPushButton::clicked, [] () {
qDebug() <show();
}
void traverseVector()
{
QVector<int> intVec {1, 2, 3};
foreach(int i, intVec) {
qDebug() << i;
}
for (const auto& i : intVec) {
qDebug() << i;
}
}
void runInThread()
{
QThread* thread = new QThread;
connect(thread, &QThread::started, [thread] () {
qDebug() << "Thread started";
});
connect(thread, &QThread::finished, [thread] () {
qDebug() <start();
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/206022.html
微信掃一掃
支付寶掃一掃