Qt 工具類(05) 在Qt裡使用Lamda表示式

2021-10-25 07:28:54 字數 2688 閱讀 1748

三、在qt中使用lambda表示式函式

四、總結

lambda 表示式是在 c++11 中加入的 c++ 特性,利用lambda 表示式在編寫**時更加方便,而且**更具有可閱讀性。

使用qt的訊號槽的時候,就可以省略定義槽函式、實現槽函式以及新增全域性變數的煩人步驟。

lambda表示式(lambda expression)是乙個匿名函式,即沒有函式名的函式。lambda表示式基於數學中的λ演算得名,直接對應於其中的lambda抽象。

匿名這個稱呼不算太陌生,在c語言裡,定義結構體的時候,有時候會涉及到匿名這個概念。比如

struct

a,b;

// 定義了乙個結構體,結構體名稱沒人在乎,只知道有包含了int型別資料域的變數 a,b,但是變數a和b的型別是 struct unnamed

同理,匿名函式也是差不多的, 但是語法有點奇怪。

[capture]

(parameters)

mutable

->

return

-type

// [捕獲列表] (引數列表) mutable -> 返回型別

// 其中除了「」(捕獲列表,可以為空)和「」,其它都是可選的。

[ capture ]:捕捉列表。

表示lambda函式的開始,實際上,是lambda引出符。編譯器根據該引出符判斷接下來的**是否是lambda函式。

捕捉列表能夠捕捉上下文中的變數以供lambda函式使用,可以為空。

( parameters ):引數列表

與普通函式的引數列表一致。如果不需要引數傳遞,則可以連同括號「()」一起省略;

mutable:mutable 修飾符

預設情況下,lambda函式總是乙個const函式,mutable可以取消其常量性。在使用該修飾符時,「()」引數列表不可省略(即使引數為空);

->return-type:尾置的返回型別

尾置函式的返回型別。可以在不需要返回值的時候也可以連同符號」->」一起省略。此外,在返回型別明確的情況下,也可以省略該部分,讓編譯器對返回型別進行自動推導;

:函式體

與普通函式一樣,不過除了可以使用引數之外,還可以使用所有捕獲的變數。

// 普通函式

intmax

(int a,

int b )

// lamda表示式函式 利用auto關鍵字和型別推導,如果不用auto關鍵字,max就需要宣告成: int (*max)(int &,int &)

auto max =

(int

&a,int

&b )

;//由於lambda表示式函式一旦固定,則其型別就固定。利用auto

//全部型別都基於型別推斷的泛型lambda表示式

auto max =

(auto

&a,auto

&b )

;

lambda函式可以通過捕獲列表訪問一些上下文中的資料。具體地,捕捉列表描述了上下文中哪些資料可以被lambda使用,以及使用方式(以值傳遞的方式或引用傳遞的方式)。語法上,在「[ ]」包括起來的是捕捉列表,捕捉列表由多個捕捉項組成,並以逗號分隔。

捕捉列表有以下幾種形式:

[ var ]表示值傳遞方式捕捉變數var;

[ = ]表示值傳遞方式捕捉所有父作用域的變數(包括this);

[ &var ]表示引用傳遞捕捉變數var;

[ & ]表示引用傳遞方式捕捉所有父作用域的變數(包括this);

[ this ]表示值傳遞方式捕捉當前的this指標。

上面提到了乙個父作用域,也就是包含lambda函式的語句塊,說通俗點就是包含lambda的「{}」**塊。上面的捕捉列表還可以進行組合,例如:

[=,&a,&b]表示以引用傳遞的方式捕捉變數a和b,以值傳遞方式捕捉其它所有變數;

[&,a,this]表示以值傳遞的方式捕捉變數a和this,引用傳遞方式捕捉其它所有變數。

不過值得注意的是,捕捉列表不允許變數重複傳遞。下面一些例子就是典型的重複,會導致編譯時期的錯誤。例如:

[=,a]這裡已經以值傳遞方式捕捉了所有變數,但是重複捕捉a了,會報錯的;

[&,&this]這裡&已經以引用傳遞方式捕捉了所有變數,再捕捉this也是一種重複。

lambda 表示式可以通過 「獲取」 來使用當前父作用域中的變數。

#include

intmain

(int argc,

char

*ar**)

);return a.

exec()

;}

#include

intmain

(int argc,

char

*ar**)

);return a.

exec()

;}

通過上面這兩個小例子,還是可以清晰地感受到使用lambda表示式所帶來的便利。特別是在使用qt的widgets時,用**寫介面是,可以在widget的建構函式裡直接關聯訊號與lambda表示式函式,而省略了一大堆的成員變數、槽函式等。

QT 在qt中使用QProcess類執行tar指令

qt提供了乙個qprocess類用於啟動外部程式並與之通訊。這個類是非同步工作的,而且在後台執行,這樣使用者介面就可以始終保持響應。qprocess start 與qprocess execute 都能完成啟動外部程式的任務,二者有什麼區別呢?區別在於start 是非阻塞的,而execute 是阻塞...

qt 靜態工具類

1 myinclude.h ifndef myinclude h define myinclude h 2 mystaticclass.cpp ifndef mystaticclass h define mystaticclass h endif mystaticclass h include my...

Qt學習一 直接使用QT工具

今天通過直接使用qt的一些工具來編寫命令列程式,可以看到一種qt的更加通用的使用方法。內容非常簡單,輸出當前的日期。首先使用的是qdate類,可以使用qdate類的靜態方法currentdate來獲得當前日期。其次,標準庫裡面的cout已經無法輸出qstring型別,就此使用qtextstream類...