Qt connect 无法识别 lambda 表达式

Qt connect doesn't recognize with lambda expression

我设计了一个 QTableWidgetQPushButton,我想用一个插槽连接这些按钮以隐藏一些行。

我正在使用 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)>)'

所以我不明白为什么 Qt 5.9.1 MinGw 32 位 .

无法识别 connect()

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

您的连接有误。您不能将不带参数的函数 (clicked()) 与带参数的函数(您的 lambda)连接起来。要验证是否是这种情况,只需执行以下操作:

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

并确保它可以编译。您必须以信号和插槽兼容的方式进行设计。

还要避免在信号和槽中使用 lambda。阅读注意事项 here.

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

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

将指针转换回 QPushButton *,错误应该会消失。