Qt connect无法识别lambda表达式

时间:2017-08-04 07:44:29

标签: c++ qt lambda slot

我设计了QTableWidget QPushButton,我想将这些按钮与一个插槽连接以隐藏一些行。

我正在使用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)被声明为函数。并且,作为一个插槽,它不起作用,
  • CONFIG += c++11已添加到专业文件中,
  • 我的班级MainWidget继承自QWidget
  • 标题中添加了
  • Q_OBJECT

所以我不知道为什么{em> Qt 5.9.1 MinGw 32bit 无法识别connect()

为lambda表达式编辑:[this,i]()而不是[this](const int i)

2 个答案:

答案 0 :(得分:1)

您的连接错误。你不能用一个带参数的函数(你的lambda)来连接一个不带参数的函数(clicked())。要验证是否是这种情况,请执行以下操作:

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

看到它会编译。您必须以信号和插槽兼容的方式进行设计。

还要避免在信号和插槽中使用lambdas。阅读警告here

答案 1 :(得分:1)

我正在阅读您对已接受答案的评论,并注意到问题的根源:抛出此错误是因为对象的有效类型 — 提供给 QObject::connect;即 QWidget 在您的情况下 - 未定义参考信号 QPushButton::clicked

可能发生的情况是 QPushButton 指针被转换为 QWidget,然后 那个 指针被赋予 connect 而不是定义信号。

将指针转换回 QPushButton * 并且错误应该消失。