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

C++ 为什么Qt在信号和插槽中抛出lambda表达式错误?,c++,qt,lambda,C++,Qt,Lambda,我有一个功能(公用插槽) 连接至QCompleter的信号,如 connect(completer_part_invoice, SIGNAL(activated(QString)), this, SLOT(Testing(QString))); 上面代码的目的是,每当我使用QCompleter中的complete()函数时,建议都会在“行编辑”中弹出,单击建议后,特定的文本就会出现在“行编辑”中 上面的代码正如我所期望的那样工作 问题 因为函数只有一条语

我有一个功能(公用插槽)

连接至QCompleter的信号,如

connect(completer_part_invoice, SIGNAL(activated(QString)),
                    this, SLOT(Testing(QString)));
上面代码的目的是,每当我使用QCompleter中的complete()函数时,建议都会在“行编辑”中弹出,单击建议后,特定的文本就会出现在“行编辑”中

上面的代码正如我所期望的那样工作

问题 因为函数只有一条语句,所以我想在connect函数本身中使用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&)>)'
             );
         ^
但是Qt抛出了错误

error: no matching function for call to 'Parts::connect(QCompleter*&, const char [20], Parts::pop_Up_Invoices()::<lambda(const QString&)>)'
             });
              ^
错误:调用“Parts::connect(QCompleter*&,const char[20],Parts::pop_Up_Invoices():)”时没有匹配的函数
});
^
我做错了什么

Try3

正如我在评论中指出的,我也尝试过

connect(
    completer_part_invoice, QOverload<const QString &>(&QCompleter::activated),
    [&](const QString &text)->void
    {
    ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
});
连接(
完成者\零件\发票,QOverload(&QCompleter::已激活),
[&](常量字符串和文本)->void
{
ui\u添加\u新建\u零件->行编辑\u发票编号->设置文本(文本);
});
我犯了一个错误

 error: no matching function for call to 'QOverload<const QString&>::QOverload(<unresolved overloaded function type>)'
                 completer_part_invoice, QOverload<const QString &>(&QCompleter::activated), 

                                                                                    ^
错误:调用'QOverload::QOverload()'时没有匹配的函数
完成者\零件\发票,QOverload(&QCompleter::已激活),
^

试着从这部分中删除
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);
        });
连接(
完成者\部分\发票、静态\铸造(&QCompleter::已激活),
[&](常量字符串和文本)->void
{
ui\u添加\u新建\u零件->行编辑\u发票编号->设置文本(文本);
});
谢谢大家

编辑:如评论和其他答案所述,我在第三次尝试中缺少了“of” 现在这也起作用了

        connect(completer_part_invoice, 
                QOverload<const QString&>::of(&QCompleter::activated),
            this, [&](const QString& text) {
                ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
        });
connect(完成者、零件、发票、,
QOverload::of(&QCompleter::已激活),
此,[&](常量QString&text){
ui\u添加\u新建\u零件->行编辑\u发票编号->设置文本(文本);
});

您使用新调用语法的方式使其不明确。比较:

connect(obj, SIGNAL(activated(QString)), ...)

有关激活的
的类型信息丢失,编译器必须将其扣除。问题是:该方法有两个重载:

void C::activated(const QString &text)
void C::activated(const QModelIndex &index)
使用更高级的模板机制,可以使
连接
根据连接接收器端的类型选择重载。但它还没有实施。这就是为什么Qt提供了
QOverload
QOverload
,这样您就不必自己编写笨拙的强制转换。以下所有版本均为等效版本;
qOverload
one稍微不那么冗长,但需要更新的编译器。
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), ...)
connect(obj,QOverload::of(&Class::activated),…)
连接(obj、qOverload(&Class::已激活),…)
连接(obj、静态转换(&Class::已激活),…)

这是因为
QCompleter
有两个
重载被激活。您需要指定要使用的选项:

connect(completer_part_invoice, QOverload<const QString&>::of(&QCompleter::activated),
    this, [&](const QString& text) {
        ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
});
connect(完成者\部分\发票,QOverload::of(&QCompleter::已激活),
此,[&](常量QString&text){
ui\u添加\u新建\u零件->行编辑\u发票编号->设置文本(文本);
});

事实上,是的。您的Try 3丢失
::of
QOverload

之后,您应该添加
作为lambda插槽的接收器,因为否则即使您的对象已被销毁,信号也可能执行lambda et Try访问
用户界面添加新的部分
,这是一个很好的做法。@G.M.我尝试了他们所有可能的解决方案,但没有成功help@ymoreau我试了[这个,&]也试了[这个],但没用either@king_nak答案与G.M1首先指出的解几乎相同。它是(…)的
QOverload::of
QOverload(…)
。2.您使用什么Qt版本?3.你使用的是什么编译器和版本/ C++版本?issue@guru另外,在“text”之前删除这个符号“&”,我试过了,这是一个糟糕的建议<代码> const qStand & <代码>是如何在C++中传递任何非平凡值的。OOP,都在注释中了。
void C::activated(const QString &text)
void C::activated(const QModelIndex &index)
connect(obj, QOverload<QString>::of(&Class::activated), ...)
connect(obj, qOverload<QString>(&Class::activated), ...)
connect(obj, static_cast<void(Class::*)(const QString&)>(&Class::activated), ...)
connect(completer_part_invoice, QOverload<const QString&>::of(&QCompleter::activated),
    this, [&](const QString& text) {
        ui_add_new_part->lineEdit_InvoiceNumber->setText(text);
});