2009-07-27 3 views
2

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

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

Hinweis: Proxy kann gesetzt werden. Ich benutzte this example von Qt's Homepage.

Antwort

0

Zuerst sollten Sie wahrscheinlich QNetworkAccessManager anstelle von QHttp verwenden.

Verwenden Sie eine von ihnen, sollten Sie eine Dummy-Abfrage zu einer Website tun, die Sie fast immer wissen, werden (z. B. http://www.google.com/) und verwenden Sie das als Test, um zu sehen, 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, dass es nicht leer ist, bevor Sie in Ihre Datei schreiben.

1

Sie zum QNetworkAccessManager wechseln sollte als Mike Vorgeschlagen, hier ist ein Beispiel für einen Schlitz auf dem fertigen (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(); 
    } 
} 

}

0

Jedes Mal, wenn Sie eine Datei schreiben, die bereits existieren könnte, Sie sollten zuerst einen QTemporaryFile erstellen und ihn dann nach erfolgreichem Download in den endgültigen Namen umbenennen.

0

Ich stieß auf das gleiche Problem, nachdem ich ein wenig herumgestochert habe, habe ich das Problem auf die Projektkonfigurationsdatei (.pro) isoliert, in der defekten Konfiguration verband ich die Netzwerkbibliothek explizit mit der Anweisung: "LIBS + = -lQtNetwork". In der Arbeitskonfiguration nutzte ich den formaleren (und qt-kompilierenden) Lösungsansatz, welche Qt-Komponenten im Projekt enthalten sind: "QT = core gui network xml", passen Sie diese entsprechend an, die netowkring-Slots nicht Arbeiten an Windows, wenn explizit verknüpft, aber unter Linux funktioniert. Die Verwendung des qt-Kompilant-Ansatzes funktioniert auf beiden Plattformen.