在我的程序中,我需要下载一个文件,我发现了这篇文章:
http://www.java2s.com/Code/Cpp/Qt/DownloadfromURL.htm
这段代码确实有效,但它不适合我的程序,所以我重新编写了它.我还没有完成所有这些,但我已经编码了基础知识.但是,当我测试它时,会弹出一个发送错误报告窗口.
到目前为止这是我的代码:
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);
};
Run Code Online (Sandbox Code Playgroud)
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)
{
}
Run Code Online (Sandbox Code Playgroud)
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()));
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,它还没有完全完成,但我希望这部分在我继续前工作.
我也是Qt的新手所以任何提示都会受到赞赏.
reply用NULL在你的构造.reply在创建(reply = manager.get(...))后连接,而不是在构造函数内部.QNetworkReply永远不会被删除QNetworkManager的文件说:请勿删除连接到此信号的插槽中的回复对象.使用deleteLater().
所以你不应该QNetworkReply在finished插槽中调用delete .
finished插槽设置中data,0仅将参数值设置为0,而不是您的类成员reply.这是一段不必要的代码.您应该将您的reply成员设置为NULL.此外,每次获得数据块时都应考虑写入文件,因为整个文件将在当前情况下缓存在内存中.当指向URL的文件很大时,它可能会导致软件的大量内存使用.