为什么Qt在信号和插槽中为lambda表达式抛出错误?
Why Qt is throwing error for lambda expression in signal and slot?
我有一个函数(公共插槽(
void Parts::Testing(QString text)
{
ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
}
连接到QCompleter的信号作为
connect(completer_part_invoice, SIGNAL(activated(QString)),
this, SLOT(Testing(QString)));
上述代码的目的是,每当我使用 QCompleter 的 complete(( 函数时,建议就会在行编辑中弹出,单击建议后,该特定文本应该出现在行编辑中。
上面的代码按我预期工作
问题由于该函数只有一个语句,我想在连接函数本身中使用 lambda 表达式。从而节省代码长度并提高可读性。 在谷歌上搜索时,我发现了这个。在引用网站时,我编写了这样的代码
尝试 1
connect(
completer_part_invoice, &QCompleter::activated,
[&]( const QString &text )
{
ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
});
但是Qt抛出了错误
error: no matching function for call to 'Parts::connect(QCompleter*&, <unresolved overloaded function type>, Parts::pop_Up_Invoices()::<lambda(const QString&)>)'
);
^
尝试 2
connect(
completer_part_invoice, SIGNAL(activated(QString)),
[&]( const QString &text )
{
ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
});
但是Qt抛出了错误
error: no matching function for call to 'Parts::connect(QCompleter*&, const char [20], Parts::pop_Up_Invoices()::<lambda(const QString&)>)'
});
^
我做错了什么?
尝试3
正如评论中所指出的,我也尝试过
connect(
completer_part_invoice, QOverload<const QString &>(&QCompleter::activated),
[&](const QString &text)->void
{
ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
});
我得到的错误
error: no matching function for call to 'QOverload<const QString&>::QOverload(<unresolved overloaded function type>)'
completer_part_invoice, QOverload<const QString &>(&QCompleter::activated),
^
那是因为QCompleter
有两个重载activated
。您需要指定要使用的一个:
connect(completer_part_invoice, QOverload<const QString&>::of(&QCompleter::activated),
this, [&](const QString& text) {
ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
});
实际上,它在文档中。您的Try 3在QOverload<const QString &>
后丢失了::of
。
使用新调用语法的方式使其不明确。比较:
connect(obj, SIGNAL(activated(QString)), ...)
跟
connect(obj, &Class::activated, ...)
缺少有关activated
的类型信息,编译器必须扣除它。问题是:该方法有两个重载:
void C::activated(const QString &text)
void C::activated(const QModelIndex &index)
使用更先进的模板机制,可以根据连接的接收器侧的类型选择过载connect
。但它尚未实施。这就是为什么Qt提供QOverload
和qOverload
,这样你就不必自己写笨拙的演员表。以下所有版本都是等效的;qOverload
的不那么冗长,但需要更新的编译器。该QOverload
适用于当前Qt支持的所有编译器。
connect(obj, QOverload<QString>::of(&Class::activated), ...)
connect(obj, qOverload<QString>(&Class::activated), ...)
connect(obj, static_cast<void(Class::*)(const QString&)>(&Class::activated), ...)
尝试从这部分中删除const
(const QString &text (
最后,经过评论中提到的答案的大量试验和错误,我能够毫无错误地编译并且它有效
connect(
completer_part_invoice, static_cast<void (QCompleter::*)(const QString&)>(&QCompleter::activated),
[&](const QString &text)->void
{
ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
});
谢谢大家
编辑:如评论和其他答案中所述,我在尝试3中缺少"的" 现在这也有效
connect(completer_part_invoice,
QOverload<const QString&>::of(&QCompleter::activated),
this, [&](const QString& text) {
ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
});
相关文章:
- 这 4 个 lambda 表达式之间有什么区别?
- 使用成员在类中创建 lambda 表达式
- 使用自动推导的 lambda 参数作为常量表达式
- 将 lambda 表达式传递给 std::function in C++
- 在 lambda 表达式中使用 std::atomic
- 不是 lambda 函数中的常量表达式
- &&对lambda表达式有什么好处?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 列表.erase 中的 lambda 表达式
- 使用 lambda 表达式的 Raspbian G++ 8.3.0 导致 ']' 之前的预期主表达式 - 即使标准设置为 c++14
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- C++: priority_queue:模板参数中的 lambda 表达式
- 容器如何处理 lambda 表达式的参数
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 如何在 lambda 表达式中传递变量?
- 针对 std::function 的 lambda 表达式和模板推导:为什么会这样?
- 如何修改Lambda表达式以将输出放入文本文件
- C++如何使用lambda表达式来捕获上一次迭代的值
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- C++:从捕获函数参数的函数返回 lambda 表达式