2015-01-17 228 views
-3

我正在寻找关于我的小程序的帮助。我想使用QNetwork类从网站下载安装程序(.exe)。我已经搜索并阅读了很多关于它的文章,但它不起作用。从网站下载文件

download.cpp:

Download::Download(QObject *parent) : 
QObject(parent) 
{ 
} 

void Download::initialiseDownload() 
{ 
    QNetworkAccessManager manager; 
    QNetworkRequest request; 

    request.setUrl(QUrl("http://www.mylink.com/setup.exe")); 
    reply = manager.get(request); 

    QObject::connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError))); 
    QObject::connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateProgress(qint64, qint64))); 
    QObject::connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished())); 
} 

void Download::downloadError(QNetworkReply::NetworkError err) 
{ 
    qDebug() << reply->errorString(); 
    reply->deleteLater(); 
} 

void Download::updateProgress(qint64 read, qint64 total) 
{ 
    qDebug() << "Progress..."; 
    qint64 percent = (read/total) * 100; 
    qDebug() << percent; 
} 

void Download::downloadFinished() 
{ 
    qDebug() << "Finished !"; 
    QByteArray b = reply->readAll(); 
    QFile file("./sdk/setup.exe"); 
    file.open(QIODevice::WriteOnly); 
    QDataStream out(&file); 
    out << b; 
    reply->deleteLater(); 
} 

download.h:

#include "launcher.h" 
#include <QObject> 
#include <QtNetwork> 

class Download : public QObject, public Launcher 
{ 
    Q_OBJECT 
public: 
    explicit Download(QObject *parent = 0); 
    void Download::initialiseDownload(); 

private slots: 
    void downloadError(QNetworkReply::NetworkError err); 
    void updateProgress(qint64 read, qint64 total); 
    void downloadFinished(); 

private: 
    QNetworkReply *reply; 
}; 

我已经添加了OpenSSL中的DLL和它的工作。我还在“.pro”文件中添加了“网络”。但是,当我运行我的程序时,我点击另一个类的按钮,initialiseDownload()正在工作,但信号似乎是不活动的。

在此先感谢!

回答

4

在您的Download::initialiseDownload()函数中,您将创建一个QNetworkAccessManager,该函数在函数结束时超出范围。

将您的QNetworkAccessManager作为成员变量或至少在下载期间存在的地方。

考虑,你打电话给你的类“下载”,它可能是最合乎逻辑的QNetworkAccessManager生活(或)您Download实例的父母,因为你(能)simultanously具有相同QNetworkAccessManager启动多个下载。