这是一个从谷歌翻译获得翻译并返回结果的函数:
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
时,那就不会工作!
如何在不中断的情况下做到这一点?
答案 0 :(得分:0)
将所有内容后移动到一个插槽并将其连接到reply
的{{1}}信号,您需要将回复存储为字段。
您将需要一个发出结果的新信号。
在某些时候你需要一个processEvents循环或者一直返回到线程的事件循环。
答案 1 :(得分:0)
如果你想要&#34;阻止&#34;方式,您可以使用QEventLoop
:
使用processEvents
代码中的无限循环使用以下模式:
QEventLoop loop;
connect( reply, &QNetworkReply::finished, &loop, &QEventLoop::quit );
loop.exec();
对于使用回复,您可以使用QJsonObject
和其他。