Используя библиотеки QNetworkReply и QNetworkAccessManager я скачал .exe файл, но не понимаю как его открыть. Его негде нету. Такое чувство, что он просто в оперативе сидит и как вытащить я не знаю. Может кто подскажет?
Если постоянно скачивать файл, то размер приложения будет расти и не падать.
Исходный код прилагаю
Он очень простой
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
NetworkManager = new QNetworkAccessManager();
process = new QProcess(this);
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::startDownload);
connect(NetworkManager, &QNetworkAccessManager::finished, this, &MainWindow::downloadFinished);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::startDownload()
{
QNetworkRequest downloadRequest(QUrl("http://www.eqdrive.com.ua/files/Updates/UpdateEQDriveConfig/UpdaterEQDrive.exe"));
QNetworkReply *reply = NetworkManager->get(downloadRequest);
connect(reply, &QNetworkReply::downloadProgress, this, &MainWindow::downloadProgress);
}
void MainWindow::downloadFinished()
{
qDebug("Download Finished");
QFile downloadedFile("UpdaterEQDrive.exe");
if(!downloadedFile.open(QIODevice::ReadOnly))
qDebug() << "Error open file: " + downloadedFile.errorString();
process->start("UpdaterEQDrive.exe");
}
void MainWindow::downloadProgress(qint64 ist, qint64 max)
{
ui->progressBar->setRange(0, max);
ui->progressBar->setValue(ist);
}
Он именно что "в оперативе сидит". Нужно вызвать метод readAll
и сложить считанный QByteArray
на диск.
Гораздо лучше будет сохранять файл по мере его загрузки. Для этого нужно реализовать обработчик сигнала readyRead
, в котором дописывать полученные порции к файлу.
Решил проблему:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
NetworkManager = new QNetworkAccessManager();
process = new QProcess(this);
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::startDownload);
connect(NetworkManager, &QNetworkAccessManager::finished, this, &MainWindow::downloadFinished);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::startDownload()
{
QUrl url("http://www.eqdrive.com.ua/files/Updates/UpdateEQDriveConfig/UpdaterEQDrive.exe");
QNetworkRequest downloadRequest;
downloadRequest.setUrl(url);
NetworkManager->get(downloadRequest);
QNetworkReply *reply = NetworkManager->get(downloadRequest);
connect(reply, &QNetworkReply::downloadProgress, this, &MainWindow::downloadProgress);
//connect(reply, &QNetworkReply::readyRead, this, &MainWindow::saveDownloadedFile);
}
void MainWindow::downloadFinished(QNetworkReply *reply)
{
if(reply->error())
{
qDebug() << reply->errorString();
} else {
QByteArray downloadedFile = reply->readAll();
QFile *file = new QFile("UpdaterEQDrive.exe");
if(file->open(QFile::WriteOnly))
{
file->write(downloadedFile);
file->close();
qDebug("Download Finished");
process->start("UpdaterEQDrive.exe");
}
}
}
void MainWindow::downloadProgress(qint64 ist, qint64 max)
{
ui->progressBar->setRange(0, max);
ui->progressBar->setValue(ist);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Столкнулся с непониманием названий имен классов в CSS3Сейчас смотрю видео с версткой, человек задает имя класса: class = "get-started-btn menu-link"
Как сделать чтобы метод Run выполнялся всё время,а метод Run2 раз в суткиИ когда Run2 работает - Run ждёт