我设计了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)
答案 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 *
并且错误应该消失。