Мой вызов qhttp get () не работает в Windows, но работает в Linux - PullRequest
1 голос
/ 29 апреля 2009

Я написал программу, которая использует qhttp для получения веб-страницы. Это отлично работает на Linux, но не работает на моем Windows-окне (Vista). Похоже, что сигнал qhttp done никогда не принимается.

Соответствующий код:

    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!
 }

Любая помощь будет оценена.

Мэтт

Ответы [ 2 ]

1 голос
/ 23 июня 2009

Переписано в соответствии с предложением Арии использовать 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();
}
1 голос
/ 29 мая 2009

Этого не должно происходить вообще, т.е. QHttp надежно работает как в Windows, так и в Unix.

Мой совет - проверить, дает ли подача правильный ответ. Это можно сделать, например, проверяя, что передача данных в порядке. Вы можете отслеживать состояние по сигналу QHttp, например, dataReadProgress , requestStarted , requestFinished и другие связанные сигналы.

С другой стороны, вместо использования старого QHttp, почему бы вместо этого не использовать рекомендуемый QNetworkAccessManager ? Чтобы быстро намочить ноги, посмотрите пример, который я опубликовал в Qt Labs некоторое время назад: программа просмотра изображений с поддержкой перетаскивания удаленных URL . Он использует указанный QNetworkAccessManager , чтобы получить изображение с удаленного URL. Проверьте исходный код , это всего 150 строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...