Какой самый быстрый способ вернуть содержимое веб-страницы в Qt?

поэтому я пытаюсь запустить какой-то простой код в Qt, чтобы вернуть содержимое данной веб-страницы. Проведя быстрое исследование, я смог разработать собственный класс, чтобы упростить процесс:

WebFetch::WebFetch()
{
nam = new QNetworkAccessManager(this);
connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
}

QString WebFetch::get(QString url)
{
nam->get(QNetworkRequest(QUrl(url)));
}

void WebFetch::finished(QNetworkReply* reply)
{
QByteArray data = reply->readAll();
QString str(data);
}

Тем не менее, есть большая проблема, которую я нахожу с приведенным выше кодом, заключается в том, что вызов является асинхронным. Мне бы хотелось, чтобы функция «get» просто возвращала строку после ее извлечения, что кажется невозможным для учетной записи, которая требует ожидания готового сигнала, и в этот момент нет способа заставить «get» вернуть любой контент, который был извлечен. у «готового» слота. Есть ли какая-либо альтернатива вышеуказанному методу или есть способ, которым я могу получить «get», чтобы вернуть контент, полученный с помощью «done»? Любая помощь будет принята с благодарностью. Спасибо!

0

Решение

Асинхронный вызов не является проблемой — это большая победа. При синхронном вызове вы, по сути, тратите потенциально сотни КБ ОЗУ и весь поток, просто праздно ожидая, что что-то вернется. Вы не можете писать такой код, притворяясь, что все происходит синхронно или даже «быстро» в этом отношении. Я даже не буду комментировать безумие запуска такого синхронного кода в потоке GUI. Также очень плохая идея запускать локальный цикл обработки событий, так как внезапно весь ваш код GUI становится реентерабельным. Я держу пари, что вы ни дизайн, ни тест для этого.

Вы должны разбить любой код, ожидающий результата, на две части: первая часть должна разместить запрос. Вторая часть в слоте уведомляется о завершении запроса и продолжает делать все, что должно быть сделано.

Если вы хотите, чтобы все это было в одном методе, используйте C ++ 11:

QNetworkAccessManager * mgr = ...;
QObject::connect(mgr, &QNetworkAccessManager::finished,
[this, mgr](QNetworkReply * reply){
// here you can do things with the reply
});
mgr->get(QNetworkRequest("....");

Для полного примера, увидеть этот 300-строчный фотографический генератор мозаики это вытягивает случайные изображения из imgur. Он широко использует асинхронную, многопоточную обработку и лямбда-выражения в указанном выше стиле.

0

Другие решения


По вопросам рекламы [email protected]