Storing data from QnetworkReply
-
Hi,
You can use a QByteArray as a buffer to keep the data in memory. Just append new data to it as they arriving.
-
Hi,
You can use a QByteArray as a buffer to keep the data in memory. Just append new data to it as they arriving.
-
Yes, except it looks like you are doing this from a free standing function. Is that the case ?
-
Yes, except it looks like you are doing this from a free standing function. Is that the case ?
-
@SGaist Hi,
Its a small example class (just header) so ba is an object, but it still dosen't work. Don't know what I'm doing wrong...
@LeeH What isn't working? What do you expect to happen? How are you trying to get/use the data later?
-
@LeeH What isn't working? What do you expect to happen? How are you trying to get/use the data later?
@ambershark Hi,
I'm trying to treat 'ba' in my example like any other class data member, so if im in main() I call a get method for 'ba' but it's always empty because the qnetworkreply data expires after the slot. Saving reply data to file has always worked in the past but just seems overkill
-
I found this https://wiki.qt.io/Download_Data_from_URL but it's still not storing data to class, only keeping it alive by emiting other signal:
void FileDownloader::fileDownloaded(QNetworkReply* pReply) { m_DownloadedData = pReply->readAll(); //emit a signal pReply->deleteLater(); emit downloaded(); }
-
I found this https://wiki.qt.io/Download_Data_from_URL but it's still not storing data to class, only keeping it alive by emiting other signal:
void FileDownloader::fileDownloaded(QNetworkReply* pReply) { m_DownloadedData = pReply->readAll(); //emit a signal pReply->deleteLater(); emit downloaded(); }
-
@LeeH
Something is a bit unclearIf you do
void output(QNetworkReply* rep){
if(!rep->error()){ ba.append(rep->readAll()); qDebug() << " ba size=" << ba.size(); } rep->deleteLater();
}
Will it then grow at all ?
Hello
@SGaist said in Storing data from QnetworkReply:
You can use a QByteArray as a buffer to keep the data in memory. Just append new data to it as they arriving.
It was a suggestion that I was trying to make sense of in my example, so Im not sure tbh
-
I found this https://wiki.qt.io/Download_Data_from_URL but it's still not storing data to class, only keeping it alive by emiting other signal:
void FileDownloader::fileDownloaded(QNetworkReply* pReply) { m_DownloadedData = pReply->readAll(); //emit a signal pReply->deleteLater(); emit downloaded(); }
@LeeH
are you calling your function upon the reply's finished signal?! -
@LeeH
are you calling your function upon the reply's finished signal?!No because If I do that, I will be able to read the data from the other function in that ba object but it will not be stored, so if i try to call that same function outside of the class it will be empty.
-
No because If I do that, I will be able to read the data from the other function in that ba object but it will not be stored, so if i try to call that same function outside of the class it will be empty.
@LeeH
but thats the point.
readAll() only returns the data when it tells you that it has finished.
Encapsulate your code into a helper class (each class has it's own QByteArray buffer). -
@LeeH
but thats the point.
readAll() only returns the data when it tells you that it has finished.
Encapsulate your code into a helper class (each class has it's own QByteArray buffer).@raven-worx said in Storing data from QnetworkReply:
Encapsulate your code into a helper class (each class has it's own QByteArray buffer).
So would I have to set objects from other places directly to the reply data?
-
@raven-worx said in Storing data from QnetworkReply:
Encapsulate your code into a helper class (each class has it's own QByteArray buffer).
So would I have to set objects from other places directly to the reply data?
@LeeH
Have a look at this sample
http://www.bogotobogo.com/Qt/Qt5_Downloading_Files_QNetworkAccessManager_QNetworkRequest.php
It uses a small helper class
class Downloader : public QObject
to manage the data it downloads. It responds to the finished signal.
Here it stores to file but you can as well store in ByteArray or whatever is needed.Also its important to understand that you should NOT call the ReadData function yourself.
Your function will be called when data is ready. Its an asynchronous API. -
@LeeH
Have a look at this sample
http://www.bogotobogo.com/Qt/Qt5_Downloading_Files_QNetworkAccessManager_QNetworkRequest.php
It uses a small helper class
class Downloader : public QObject
to manage the data it downloads. It responds to the finished signal.
Here it stores to file but you can as well store in ByteArray or whatever is needed.Also its important to understand that you should NOT call the ReadData function yourself.
Your function will be called when data is ready. Its an asynchronous API. -
@LeeH
Have a look at this sample
http://www.bogotobogo.com/Qt/Qt5_Downloading_Files_QNetworkAccessManager_QNetworkRequest.php
It uses a small helper class
class Downloader : public QObject
to manage the data it downloads. It responds to the finished signal.
Here it stores to file but you can as well store in ByteArray or whatever is needed.Also its important to understand that you should NOT call the ReadData function yourself.
Your function will be called when data is ready. Its an asynchronous API.Have a look at this sample
http://www.bogotobogo.com/Qt/Qt5_Downloading_Files_QNetworkAccessManager_QNetworkRequest.php
It uses a small helper class
class Downloader : public QObject
to manage the data it downloads. It responds to the finished signal.
Here it stores to file but you can as well store in ByteArray or whatever is needed.I already have a class doing this job - as I said in the begining I can already save my reply data to file that can be read/used from anywhere in one signal slot connection, I just want to do the same thing without using a file so it can be read/used from anywhere in a single connection. If my class data object that has been assigned (or appended to) the value of reply's byte array is always empty when called, say from outside of the class (after download), meaning I have to re-download everytime I need the same data, then the reply data is not stored to my object is it?
-
Have a look at this sample
http://www.bogotobogo.com/Qt/Qt5_Downloading_Files_QNetworkAccessManager_QNetworkRequest.php
It uses a small helper class
class Downloader : public QObject
to manage the data it downloads. It responds to the finished signal.
Here it stores to file but you can as well store in ByteArray or whatever is needed.I already have a class doing this job - as I said in the begining I can already save my reply data to file that can be read/used from anywhere in one signal slot connection, I just want to do the same thing without using a file so it can be read/used from anywhere in a single connection. If my class data object that has been assigned (or appended to) the value of reply's byte array is always empty when called, say from outside of the class (after download), meaning I have to re-download everytime I need the same data, then the reply data is not stored to my object is it?
@LeeH said in Storing data from QnetworkReply:
Hi
If you keep the instance of class Downloader around,
there is no reason you cannot keep the data for later.
Say if you append to a QByteArray variable defined as
class member in DownloaderCan you please show the actual code how you use your helper class and how you later
try to access the data? -
@LeeH said in Storing data from QnetworkReply:
Hi
If you keep the instance of class Downloader around,
there is no reason you cannot keep the data for later.
Say if you append to a QByteArray variable defined as
class member in DownloaderCan you please show the actual code how you use your helper class and how you later
try to access the data?@mrjj said in Storing data from QnetworkReply:
Can you please show the actual code how you use your helper class and how you later
try to access the data?Certainly.
header:
class data : public QObject{ Q_OBJECT public: data(); void download(); QByteArray get(); public slots: void output(QNetworkReply* rep); private: QNetworkAccessManager* _qnam; QByteArray _ba; };
source:
data::data(){} void data::download(){ _qnam = new QNetworkAccessManager(this); _qnam->get(QNetworkRequest(QUrl("http://www.google.com"))); QObject::connect(_qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(output(QNetworkReply*))); } void data::output(QNetworkReply* rep){ if(!rep->error()){ _ba.append(rep->readAll()); } rep->deleteLater(); } QByteArray data::get(){ qDebug() << _ba; }
main:
data obj; obj.download(); obj.get();
-
@mrjj said in Storing data from QnetworkReply:
Can you please show the actual code how you use your helper class and how you later
try to access the data?Certainly.
header:
class data : public QObject{ Q_OBJECT public: data(); void download(); QByteArray get(); public slots: void output(QNetworkReply* rep); private: QNetworkAccessManager* _qnam; QByteArray _ba; };
source:
data::data(){} void data::download(){ _qnam = new QNetworkAccessManager(this); _qnam->get(QNetworkRequest(QUrl("http://www.google.com"))); QObject::connect(_qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(output(QNetworkReply*))); } void data::output(QNetworkReply* rep){ if(!rep->error()){ _ba.append(rep->readAll()); } rep->deleteLater(); } QByteArray data::get(){ qDebug() << _ba; }
main:
data obj; obj.download(); obj.get();
@LeeH said in Storing data from QnetworkReply:
QNetworkReply
You should connect your output() slot to http://doc.qt.io/qt-5/qiodevice.html#readyRead signal.