在QT5中使用閉包 內聯函式Lambda

2021-08-25 17:01:06 字數 1638 閱讀 1236

步驟一:qt5支援c++11,但要使用它,還需要先在pro檔案中新增 「config+=c++11」

步驟二:

場景1、在關聯函式中嵌入lambda

connect(ui->combobox, &qcombobox::currenttextchanged, [&]());
場景2、在函式中嵌入lambda

int j = 10; 

auto bya = [=](int i)->int;

auto byb = [&];

qdebug()<<"bya: "

<1)qdebug()<<"byb: "

++j;

qdebug()<<"bya: "

<1)qdebug()<<"byb: "

capture mutable ->return-type

引數說明

[capture]

捕捉列表。總是出現在lambda函式的開始處。實際上,是lambda引出符。編譯器根據該引出符判斷接下來的**是否是lambda函式。

捕捉列表能夠捕捉上下文中的變數以供lambda函式使用;

(parameters)

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

mutable

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

return-type

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

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

與普通函式最大的區別是,除了可以使用引數以外,lambda函式還可以通過捕獲列表訪問一些上下文中的資料。具體地,捕捉列表描述了上下文中哪些資料可以被lambda使用,

以及使用方式(以值傳遞的方式或引用傳遞的方式)。語法上,在「」包括起來的是捕捉列表,捕捉列表由多個捕捉項組成,並以逗號分隔。

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

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

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

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

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

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

上面提到了乙個父作用域,也就是包含lambda函式的語句塊,說通俗點就是包含lambda的「{}」**塊。

上面的捕捉列表還可以進行組合,例如:

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

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

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

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

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

在qt5中嵌入matplotlib

from matplotlib.backends.backend qt5agg import figurecanvasqtagg as figurecanvas from matplotlib.figure import figure import matplotlib.pyplot as plt ...

在Qt5使用中文(vs環境)

如果是使用mingw版本的qt create,也就是使用gcc編譯器應該沒那麼多事吧。不過我還是用慣了vs呢。好了,廢話不多說,開始總結vs下亂碼的解決方案。vs2003 把原始碼存成 utf 8格式編碼就可以直接中文了。vs2005 08 10 13 1 qstring s1 qstringlit...

C 11 在 Qt 5 中的應用

c 11 現在已經是 c 標準,也就沒有理由不在新的應用中使用。qt 4.8 是第乙個支援 c 11 特性的 qt 版本,不過這裡,我們首先介紹的是,qt 5 中如何結合使用 c 11。至於 qt 4.8,我們會在後續文章中進行闡述。顯而易見的是,比起 qt 4.8,qt 5 利用了更多的 c 11...