Domanda

Ho scritto un programma che utilizza qhttp per ottenere una pagina web. Funziona bene su Linux, ma non funziona sul mio box di Windows (Vista). Sembra che il segnale qhttp done non sia mai ricevuto.

Il codice pertinente è:

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

Qualsiasi aiuto sarebbe valutato.

Matt

È stato utile?

Soluzione

Ciò non dovrebbe accadere affatto, ovvero QHttp funziona in modo affidabile sia su Windows che su Unix.

Il mio consiglio è di verificare se i servizi forniscono una risposta adeguata. Questo può essere fatto ad es. verificando che il trasferimento dei dati vada bene. È possibile tracciare lo stato dal segnale QHttp, ad es. dataReadProgress , requestStarted , requestFinished e altri segnali correlati.

D'altra parte, invece di utilizzare il vecchio QHttp, perché non usare il QNetworkAccessManager invece? Per bagnarti rapidamente i piedi, controlla un esempio che ho pubblicato su Qt Labs qualche tempo fa: visualizzatore di immagini con supporto di trascinamento della selezione URL remoto . Utilizza il QNetworkAccessManager per catturare l'immagine dall'URL rilasciato. Controlla il codice sorgente , sono solo 150 righe.

Altri suggerimenti

Riscritto come suggerito da Ariya per utilizzare QNetworkAccessManager e guardando questo esempio

Ora funziona su 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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top