【问题标题】:Error while connecting lambda function to QProcess::error将 lambda 函数连接到 QProcess::error 时出错
【发布时间】:2015-07-10 03:14:29
【问题描述】:

在以下代码中,我想将 lambda 函数连接到 QProcess::error 信号:

void Updater::start() {
    QProcess process;
    QObject::connect(&process, &QProcess::error, [=] (QProcess::ProcessError error) {
        qWarning() << "error " << error;
    });
    process.start("MyProgram");
    process.waitForFinished();
}

但我收到奇怪的错误:

错误:没有匹配的函数调用 'Updater::connect(QProcess* [未解决的重载函数类型], 更新程序::start()::)' });

我在这里做错了什么?代码在从 QObject 派生的类的方法内部执行。项目配置为使用 c++11。

我在 Linux x32 上使用 Qt 5.3.1 和 gcc 4.9.2

【问题讨论】:

标签: qt c++11 lambda qprocess


【解决方案1】:

问题是QProcess 有另一个error() 方法,所以编译器只是不知道使用哪个方法。如果你想处理重载的方法,你应该使用next:

QProcess process;
connect(&process, static_cast<void (QProcess::*)(QProcess::ProcessError)>
(&QProcess::error), [=](QProcess::ProcessError pError) {
    qWarning() << "error " << pError;
});
process.start("MyProgram");
process.waitForFinished();

是的,它看起来很丑,但没有其他方法(只有旧语法?)。

这个特殊的行告诉编译器你想使用void QProcess::error(QProcess::ProcessError error),所以现在没有任何歧义了

More information you can find here.

【讨论】:

  • 谢谢@Chernobyl,这对我有帮助!
  • 另请参阅stackoverflow.com/a/16795664/846250 以获取小 sn-p 以使重载声明“自动”
  • 发现static_cast 的要求很棘手,谢谢。
  • 只是一个旁注:同样适用于finished 信号:static_cast&lt;void (QProcess::*)(int, QProcess::ExitStatus)&gt;(&amp;QProcess::finished)。一定要喜欢 C++ 意大利面条语法。哈哈
【解决方案2】:

对于使用 Qt 5.6 或更高版本的用户,QProcess::error 信号已被弃用。您可以改用QProcess::errorOccurred 信号以避免命名模糊和复杂的转换。

QProcess process;
connect(&process, &QProcess::errorOccurred, [=](QProcess::ProcessError error) {
    qWarning() << error;
});
process.start("MyProgram");
process.waitForFinished();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2017-03-09
    • 2013-07-15
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多