从URL下载Qt中的文件

Bla*_*ris 8 c++ qt qt4

在我的程序中,我需要下载一个文件,我发现了这篇文章:

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的新手所以任何提示都会受到赞赏.

Kam*_*mek 6

  • 你正在使用未初始化的指针,所以它指出无处可去.初始化replyNULL在你的构造.
  • 您应该reply在创建(reply = manager.get(...))后连接,而不是在构造函数内部.
  • QNetworkReply永远不会被删除QNetworkManager文件说:

请勿删除连接到此信号的插槽中的回复对象.使用deleteLater().

所以你不应该QNetworkReplyfinished插槽中调用delete .

  • finished插槽设置中data,0仅将参数值设置为0,而不是您的类成员reply.这是一段不必要的代码.您应该将您的reply成员设置为NULL.

此外,每次获得数据块时都应考虑写入文件,因为整个文件将在当前情况下缓存在内存中.当指向URL的文件很大时,它可能会导致软件的大量内存使用.