2015-01-17 4 views
-3

Я ищу помощь по моей маленькой программе. Я хочу загрузить установку (.exe) с веб-сайта с использованием класса QNetwork. Я уже занимаюсь поиском и чтением многих сообщений об этом, но это не работает.Скачать файл с веб-сайта

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 экземпляра, так как вы (можете) запускать несколько загрузок с одновременной установкой одной QNetworkAccessManager.