Téléchargement du Fichier Qt à Partir de l'URL
Dans mon programme j'ai besoin de télécharger un fichier, et je suis tombé sur cet article:
http://www.java2s.com/Code/Cpp/Qt/DownloadfromURL.htm
Ce code ne fonctionne pas mais elle ne rentre pas dans mon programme j'ai donc re-codé. Je n'ai pas terminé, mais j'ai les bases codé. Cependant, quand je l'ai tester, il apparaît avec un envoyer le rapport d'erreur de la fenêtre.
Jusqu'à présent c'est mon 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()));
}
Comme je l'ai dit il n'est pas complètement fini, mais je veux de la présente partie, de travail avant de passer.
Je suis aussi nouvelle pour Qt donc tout les conseils seront les bienvenues.
OriginalL'auteur Blair Harris | 2010-12-08
Vous devez vous connecter pour publier un commentaire.
reply
avecNULL
dans votre constructeur.reply
après il a été créé (reply = manager.get(...)
), pas à l'intérieur de votre constructeur.QNetworkReply
n'est jamais supprimé parQNetworkManager
comme docs dire:De sorte que vous ne devriez pas appeler delete sur
QNetworkReply
dansfinished
logement.finished
paramètre d'emplacementdata
à0
ne définir une valeur de paramètre à0
, pas votre membre de la classereply
. C'est une inutiles ligne de code. Vous devez définir votrereply
membre deNULL
à la place.En outre, vous devriez envisager d'écrire dans un fichier à chaque fois que le segment de données, comme l'ensemble du dossier sera mis en mémoire tampon dans votre cas. Il peut conduire à d'énormes utilisation de la mémoire de votre logiciel lorsque le fichier pointé URL est grand.
OriginalL'auteur Kamil Klimek
Vous avez besoin QCoreApplication pour démarrer la boucle d'événements pour Qt4.
Quelque chose comme cela devrait fonctionner (pas testé) :
edit :: nouvelle version
J'ai trouvé quelques problèmes :
data
à l'intérieur deQtDownload::downloadFinished
, qui ne devrait pas être fait, il est géré par Qt, donc c'était de se faire supprimé deux fois.reply
3 fois.Voici la version modifiée :
qtdownload.h :
qtdownload.cpp :
main.cpp :
Correction du code.
Désolé, pour beaucoup d'erreurs dans votre réponse
quelles erreurs, le soin de l'expliquer?
Expliqué dans ma réponse. Principalement il s'agit de "Qt gère"
OriginalL'auteur OneOfOne
Comme vous l'avez demandé, quelques commentaires d'ordre général:
localFile.write(data->readAll()) n'est pas garanti pour écrire toutes les données à la fois. c'est pourquoi il a une valeur de retour, vous devez vérifier, pour s'assurer que tout est écrit. Si elle renvoie -1, vous devez gérer l'erreur.
Omettre le si. La suppression d'un pointeur null est sûr.
OriginalL'auteur Frank Osterfeld