Мой вызов qhttp get() не работает в Windows, но работает в Linux
Вопрос
Я написал программу, которая использует qhttp для получения веб-страницы.Это отлично работает в Linux, но не работает в моей системе Windows (Vista).Похоже, что сигнал выполнения qhttp никогда не получен.
Соответствующий код:
Window::Window()
{
http = new QHttp(this);
connect(http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));
url = new QUrl("http://something.com/status.xml");
http->setHost(url->host(), url->port() != -1 ? url->port() : 80);
if (!url->userName().isEmpty()) http->setUser(url->userName(), url->password());
}
void Window::retrievePage()
{
byteArray = new QByteArray;
result = new QBuffer(byteArray);
result->open(QIODevice::WriteOnly);
httpRequestAborted = false;
httpGetId = http->get(url->path(), result);
}
void Window::httpDone(bool error)
{
//Never gets here!
}
Любая помощь будет принята.
Мэтт
Решение
Этого вообще не должно происходить, т.е.QHttp надежно работает как в Windows, так и в Unix.
Мой совет: проверьте, дает ли подача правильный ответ.Это можно сделать, например.проверив, что передача данных в порядке.Вы можете отслеживать статус по сигналу QHttp, например. данныеЧтениеПрогресс, запросНачало, запросЗавершен, и другие связанные сигналы.
С другой стороны, вместо использования старого QHttp, почему бы не использовать рекомендуемый QNetworkAccessManager вместо?Чтобы быстро намочить ноги, посмотрите пример, который я опубликовал в Qt Labs некоторое время назад: просмотрщик изображений с поддержкой удаленного перетаскивания URL-адресов.Он использует сказанное QNetworkAccessManager чтобы получить изображение из переброшенного URL-адреса.Проверить исходный код, это всего 150 строк.
Другие советы
Переписано, как предложила Ария, для использования QNetworkAccessManager и просмотра этот пример
Теперь это работает в Windows и Linux.
Window::Window()
{
connect(&manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(retrieveData(QNetworkReply*)));
}
void Window::retrieveMessage()
{
manager.get(QNetworkRequest(QUrl("http://...")));
}
void Window::retrieveData(QNetworkReply *reply)
{
QVariant statusCodeV =
reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
// "200 OK" received?
if (statusCodeV.toInt()==200)
{
QByteArray bytes = reply->readAll(); // bytes
}
reply->deleteLater();
}