2015-01-17 12 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 : 나는 OpenSSL을위한 DLL을 추가했고 그것이 작동

#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; 
}; 

. 또한 ".pro"파일에 "네트워크"를 추가했습니다. 그러나 프로그램을 실행하고 다른 클래스의 푸시 버튼을 클릭하면 initialiseDownload()가 작동하지만 신호가 비활성 상태 인 것처럼 보입니다.

미리 감사드립니다.

답변

4

Download::initialiseDownload() 함수에서 함수 끝에서 범위를 벗어나는 QNetworkAccessManager을 만듭니다.

QNetworkAccessManager을 회원 변수 또는 최소한 다운로드 기간 동안 살아있는 어딘가에 넣으십시오. 같은 QNetworkAccessManager와 simultanously 여러 다운로드를 시작 (수)부터

당신이 당신의 클래스 "다운로드"를 호출 점을 감안하면, 아마 당신의 Download 인스턴스의 부모 QNetworkAccessManager의 삶 (또는 인) 것이 가장 논리적입니다.