2009-07-30 22 views
9

Sto scaricando un file utilizzando QNetworkAccessManager :: ottieni ma a differenza di QHttp :: non c'è modo incorporato per scrivere direttamente la risposta su un altro oggetto QIOD.Scrittura di un QNetworkReply su un file

Il modo più semplice sarebbe quella di fare qualcosa di simile:

QIODevice* device; 

QNetworkReply* reply = manager.get(url); 
connect(reply, SIGNAL(readyRead()), this, SLOT(newData())); 

e poi nello slot newData:

device->write(reply->readAll()); 

Ma non sono sicuro se questo è il modo giusto, forse perso qualcosa.

risposta

7

Sembra corretto. Vorrei utilizzare i moduli di livello inferiore di read() e write(), non quelli di QByteArray, che non supportano correttamente la gestione degli errori, ma a parte questo, sembra a posto.

Hai problemi con questo?

+0

io non ho fatto funzionare in problemi finora, ma io sono preoccupato del fatto che se ho una grande quantità di download paralleli, tutta questa operazione potrebbe causare un collo di bottiglia. –

+1

Improbabile, ma possibile. Puoi ottimizzare usando un 'char buffer [4098]' per evitare che 'malloc() s' sia coinvolto nella creazione di' QByteArray'. C'è anche 'QVarLengthArray'. –

+0

sì, è quello che ho fatto con il char array locale. Grazie per l'aiuto. –

-1

Utilizzare al meglio il segnale finito per leggere tutti i contenuti alla fine del processo di download. Un esempio (rimuovere il ciclo degli eventi e utilizzare un nuovo slot per renderlo asincrona):

QNetworkAccessManager manager; 
    QEventLoop loop; 
    QNetworkReply *reply = manager.get(request); 
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); 

    loop.exec(); 

    QFile file("YOUR FILE"); 
    file.open(QIODevice::WriteOnly); 
    file.write(reply->readAll()); 

    delete reply; 
+7

ciò può causare seri problemi di memoria/prestazioni quando si gestiscono richieste di grandi dimensioni –