2015-01-17 226 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啓動多個下載。