我有一个函数(公共插槽(
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);
});