2017-08-04 347 views
2

我設計了一個QTableWidgetQPushButton,我想用一個插槽連接這些按鈕來隱藏一些行。Qt連接不識別lambda表達式

我正在使用lambda表達式傳遞一行數。但是編譯器不認識到這一點表情:

connect(this->ui->tableWidget->cellWidget(i,0),&QPushButton::clicked,[this,i]{hideRows(i);}); 

我有這樣的錯誤:

error: no matching function for call to 'SoftwareUdpater::MainWidget::connect(QWidget*, void (QAbstractButton::*)(bool), SoftwareUdpater::MainWidget::displayTable()::<lambda(int)>)' 
  • 功能hideRows(int)被聲明爲函數。而且,作爲一個槽,它不會從QWidget工作,
  • CONFIG += c++11在Pro文件被添加,
  • 我的類繼承MainWidget
  • Q_OBJECT在標題中加入。

所以我不udnerstand爲什麼connect()不受的Qt 5.9.1 MinGW的32位認可。

編輯:[this,i](),而不是[this](const int i)的lambda表達式

+0

除了答案所說的外,你很可能想通過值來捕獲'i'而不是將它作爲參數'connect(this-> ui-> tableWidget-> cellWidget(i,0),&QPushButton :: clicked,[this,i](){hideRows(i);});' – PeterT

+0

同時使用'[this,i]'和'(int i)'沒有多大意義。此外,你可能需要將你的QWidget *下載到QPushbutton *'connect((QPushButton *)this-> ui-> tableWidget-> cellWidget(i,0),&QPushButton :: clicked,[this,i]() {hideRows(ⅰ);});'。這是假設它總是一個QPushbutton。 – PeterT

+0

這個錯誤信息的意思是,沒有這樣的'connect'函數,它接受這些參數。最有可能的原因是,你不知道如何用C++ 11構建,或者你用Qt4或其他外部類似的東西構建。也許你應該編輯問題來添加完整的錯誤信息,並列出候選人的名單。還要添加用於構建該文件的編譯命令。 – hyde

回答

1

你的連接是錯誤的。您不能將不帶參數的函數(clicked())與帶參數的函數(您的lambda)連接起來。要驗證是這樣,只要這樣做:

connect(this->ui->tableWidget->cellWidget(i,0),&QPushButton::clicked,[this](){}); 

然後看它會編譯。您必須以使信號和插槽兼容的方式進行設計。

還避免在信號和插槽中使用lambdas。閱讀注意事項here

+5

我不會說「避免lambdas」 - 只要知道他們如何處理信號和插槽並正確使用它們。此外,由於Qt 5.2現在可以傳遞一個上下文對象來斷開與lambda的連接,最大的缺陷就是消失了。 –

+1

@JesperJuhl同意。但我正在考慮這傢伙不瞭解關於連接的任何事情,並希望鏈接能夠解釋爲什麼他應該小心使用lambda表達式。 –

+0

謝謝。用你的代碼,我有同樣的錯誤。連接無法識別。 – LilianBr