Я ищу помощь по моей маленькой программе. Я хотел бы загрузить настройки (.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;
};
Я добавил DLL для OpenSSL, и это работает. Я также добавил «сеть» в файл .pro. Но когда я запускаю свою программу и нажимаю на кнопку другого класса, initialiseDownload () работает, но сигналы кажутся неактивными.
Заранее спасибо !
В вашем Download::initialiseDownload()
функция, вы создаете QNetworkAccessManager
это выходит за рамки в конце функции.
Положить ваши QNetworkAccessManager
как переменная-член или где-то, где он живет, по крайней мере, на протяжении всей загрузки.
Учитывая, что вы называете свой класс «Скачать», вероятно, наиболее логично, что QNetworkAccessManager
живет (или является) родителем вашего Download
экземпляр, так как вы (можете) начать несколько загрузок одновременно с одним и тем же QNetworkAccessManager
,