Downloading File in Qt From URL
c++, qt, qt4
Solution
- You're using uninitialized pointer, so it points out to nowhere. Initialize `reply` with `NULL` in your constructor.
- You should connect `reply` after it was created (`reply = manager.get(...)`), not inside of your constructor.
- `QNetworkReply` is never deleted by `QNetworkManager` as docs say:
Do not delete the reply object in the slot connected to this signal. Use deleteLater().
So you shouldn't call delete on `QNetworkReply` in `finished` slot.
- In `finished` slot setting `data` to `0` will only set parameter value to `0`, not your class member `reply`. It's an unneeded line of code. You should set your `reply` member to `NULL` instead.
Also you should consider writing to a file every time you get data chunk, as whole file will be buffered in memory in your current case. It may lead to huge memory usage of your software when file at pointed URL is big.
Problem
In my program I need to download a file, and I came across this article: http://www.java2s.com/Code/Cpp/Qt/DownloadfromURL.htm This code does work but it doesn't fit into my program so I re-coded it. I haven't completed it all but I've got the basics coded. However, when I test it, it pops up with a send error report window. So far this is my code: QtDownload.h ``` #include <QObject> #include <QString> #include <QNetworkAccessManager> #include <QNetworkReply> class QtDownload : public QObject { Q_OBJECT public: explicit QtDownload(); ~QtDownload(); void setTarget(const QString& t); private: QNetworkAccessManager manager; QNetworkReply* reply; QString target; void connectSignalsAndSlots(); signals: public slots: void download(); void downloadFinished(QNetworkReply* data); void downloadProgress(qint64 recieved, qint64 total); }; ``` QtDownload.cpp ``` #include "qtdownload.h" #include <QUrl> #include <QNetworkRequest> #include <QFile> QtDownload::QtDownload() : QObject(0) { this->connectSignalsAndSlots(); } QtDownload::~QtDownload() { if (reply != 0) delete reply; } void QtDownload::connectSignalsAndSlots() { QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(downloadFinished(QNetworkReply*))); QObject::connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64))); } void QtDownload::setTarget(const QString &t) { this->target = t; } void QtDownload::downloadFinished(QNetworkReply *data) { QFile localFile("downloadedfile"); if (!localFile.open(QIODevice::WriteOnly)) return; localFile.write(data->readAll()); localFile.close(); delete data; data = 0; } void QtDownload::download() { QUrl url = QUrl::fromEncoded(this->target.toLocal8Bit()); QNetworkRequest request(url); this->reply = manager.get(request); } void QtDownload::downloadProgress(qint64 recieved, qint64 total) { } ``` main.cpp ``` #include "qtdownload.h" #include <QTimer> int main() { QtDownload dl; dl.setTarget("http://www.java2s.com/Code/Cpp/Qt/DownloadfromURL.htm"); QTimer::singleShot(0, &dl, SLOT(download())); } ``` As I said it's not completely finished but I want this part to be working before I move on. I'm also new to Qt so any tips would be appreciated.