为什么Qt在信号和插槽中为lambda表达式抛出错误?



我有一个函数(公共插槽(

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 3QOverload<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提供QOverloadqOverload,这样你就不必自己写笨拙的演员表。以下所有版本都是等效的;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);
});

最新更新