三、在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類...