如何在没有应用程序中断的情况下从谷歌翻译获得翻译?

时间:2014-08-21 08:54:02

标签: qt qnetworkreply

这是一个从谷歌翻译获得翻译并返回结果的函数:

QString QGoogleTranslate::translate(const QString &keyword, const QString &from, const QString &to)
{
    //Locate the translation in the map
    QMap<QString, QPair<QString, QString> >::iterator itr = translations.find(keyword);
    if(itr != translations.end())
    {
        if(itr.value().first == to) {
            result = itr.value().second;
            return result;
        }
    }

    //Translate URL
    QString url = QString("http://translate.google.com/translate_a/t?client=t&text=%0&hl=%1&sl=%2&tl=%1&multires=1&prev=enter&oc=2&ssel=0&tsel=0&uptl=%1&sc=1").arg(keyword).arg(to).arg(from);

    QNetworkAccessManager manager;
    QNetworkRequest request(url);
    QNetworkReply *reply = manager.get(request);

    //Get reply from Google
    do
    {
        QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
    } while (!reply->isFinished());

    //Convert to string
    result = reply->readAll();
    reply->close();

    //Free memory
    delete reply;

    //Remove [[[" from the beginning
    result = result.replace("[[[\"", "");

    //Extract final translated string
    result = result.mid(0, result.indexOf(",\"") - 1);

    //Add the translation to the map so we don't need to make another web request for a translation
    translations[keyword] = QPair<QString, QString>(to, result);

    return result;
}

但正如您所看到的那样do while loop会在reply->isFinished()之前停止申请,而当我使用SIGNAL(finished())代替QNetworkReply代替do while loop时,那就不会工作!

如何在不中断的情况下做到这一点?

2 个答案:

答案 0 :(得分:0)

将所有内容后移动到一个插槽并将其连接到reply的{​​{1}}信号,您需要将回复存储为字段。

您将需要一个发出结果的新信号。

在某些时候你需要一个processEvents循环或者一直返回到线程的事件循环。

答案 1 :(得分:0)

如果你想要&#34;阻止&#34;方式,您可以使用QEventLoop

使用processEvents代码中的无限循环使用以下模式:

QEventLoop loop;
connect( reply, &QNetworkReply::finished, &loop, &QEventLoop::quit );
loop.exec();

对于使用回复,您可以使用QJsonObject和其他。