Pergunta

Eu escrevi um programa que usa qhttp para obter uma página web. Esta multa funciona em Linux, mas não funciona na minha caixa de Windows (Vista). Parece que o sinal qhttp feito nunca é recebido.

O código relevante é:

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

Qualquer ajuda seria appriecated.

Matt

Foi útil?

Solução

Isso não deve acontecer em todos, ou seja QHttp funciona de forma confiável tanto em Windows e Unix.

O meu conselho é verificar se os saques dá resposta adequada. Isto pode ser feito, por exemplo, verificando que a transferência de dados é muito bem. Você pode rastrear o status de sinal de QHttp, por exemplo, dataReadProgress , requestStarted , requestFinished , e outros sinais relacionados.

Por outro lado, em vez de usar QHttp velho, por que não usar o recomendado QNetworkAccessManager em vez disso? Para obter seus pés molhados rapidamente, verifique um exemplo que eu postei a Qt Labs há algum tempo: visualizador de imagens com URL remoto suporte drag-and-drop . Ele usa o disse QNetworkAccessManager para agarrar a imagem da queda URL. Verifique a código-fonte , é apenas 150 linhas.

Outras dicas

reescrita como sugerido por Ariya usar QNetworkAccessManager e olhando para este exemplo

Este agora funciona em Windows e 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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top