2 Stimmen

Problem mit QHttp Beispiel qt 4.4.3

Ich versuche, QHttp für eine Update-App zu verwenden. Aber es gibt ein Problem für mich, das ich nicht lösen kann.

Ich versuche, eine Datei herunterzuladen (funktioniert einwandfrei), aber wenn keine Internetverbindung besteht, wird die Datei zwar erstellt, hat aber 0 Bytes. Meine alte Datei wird dann mit der leeren Datei überschrieben, was für die Anwendung, die die Datei verwenden will, nicht so gut ist. Was ich brauche, ist eine Überprüfung, ob der Computer mit dem Internet verbunden ist.

Hinweis: Proxy kann sich setzen. Ich benutzte dieses Beispiel von der Homepage von Qt.

1voto

Phil Hannent Punkte 11447

Sie sollten zum QNetworkAccessManager wechseln, wie Mike vorgeschlagen hat, hier ist ein Beispiel für einen Slot auf das finished()-Signal:

void ApplicationUpdate::replyFinishedhttpGetChangeLog(QNetworkReply* myReply) {

if (myReply->error() != QNetworkReply::NoError)
{
    QByteArray returnedData = myReply->readAll();
    if (returnedData.size() > 0) {
        if( m_fileChangeLog->exists() )
        {
            m_fileChangeLog->close();
            m_fileChangeLog->remove();
        }
        m_fileChangeLog->open(QIODevice::ReadWrite);
        QDataStream out( m_fileChangeLog );
        out.writeRawData(returnedData.data(), returnedData.size());
        m_fileChangeLog->flush();
        m_fileChangeLog->close();
    }
}

}

0voto

Mike McQuaid Punkte 9326

Erstens sollten Sie jetzt wahrscheinlich QNetworkAccessManager und nicht QHttp verwenden.

Mit einer der beiden Methoden sollten Sie eine Dummy-Anfrage an eine Website stellen, von der Sie so gut wie immer wissen, dass sie verfügbar ist (z. B. http://www.google.com/ ) und verwenden Sie dies als Test, um festzustellen, ob Sie eine Internetverbindung haben.

Ein besserer Weg, dies zu tun, wäre stattdessen, QNetworkAccessManager zu verwenden, um in ein QByteArray zu lesen und dann zu überprüfen, ob es nicht leer ist, bevor man in die Datei schreibt.

0voto

Marc Mutz - mmutz Punkte 23597

Immer, wenn Sie eine Datei schreiben, die bereits existieren könnte, sollten Sie eine QTemporaryFile und benennen Sie sie nach erfolgreichem Download in den endgültigen Namen um.

0voto

Ich bin auf das gleiche Problem gestoßen. Nach einigem Herumstochern habe ich das Problem auf die Projektkonfigurationsdatei (.pro) zurückgeführt, in der fehlerhaften Konfiguration habe ich die Netzwerkbibliothek explizit mit der Anweisung "LIBS += -lQtNetwork" gelinkt. In der Arbeitskonfiguration habe ich den formaleren (und qt-kompatiblen) Ansatz verwendet, um anzugeben, welche Qt-Komponenten im Projekt enthalten sind, etwa so: "QT = core gui network xml", passen Sie es entsprechend an Ihre Situation an, die Netzwerk-Slots funktionierten unter Windows nicht, wenn sie explizit verlinkt waren, aber unter Linux schon. Die Verwendung des qt compilant Ansatzes funktioniert auf beiden Plattformen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X