2017-08-04 343 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