Fonction: Entrez la ressource d'adresse, cliquez sur télécharger, télécharger le fichier et affiche la progression du téléchargement.
Code est la suivante:
myHttp2.pro
QT += network
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QUrl>
namespace Ui {
class MainWindow;
}
class QFile;
class QNetworkReply;
class QNetworkAccessManager;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void startRequest(QUrl url);
private:
Ui::MainWindow *ui;
QNetworkAccessManager* manager;
QNetworkReply *reply;
QUrl url;
QFile *file;
private slots:
void httpFinished();
void httpReadyRead();
void updateDataReadProgress(qint64,qint64);
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QFile>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
manager = new QNetworkAccessManager(this);
ui->progressBar->hide();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::startRequest(QUrl url)
{
reply = manager->get(QNetworkRequest(url));
connect(reply,&QNetworkReply::readyRead,this,&MainWindow::httpReadyRead);
connect(reply,&QNetworkReply::downloadProgress,this,&MainWindow::updateDataReadProgress);
connect(reply,&QNetworkReply::finished,this,&MainWindow::httpFinished);
}
void MainWindow::httpReadyRead()
{
if (file) {
file->write(reply->readAll());
}
}
void MainWindow::updateDataReadProgress(qint64 bytesRead,qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(bytesRead);
}
void MainWindow::httpFinished()
{
ui->progressBar->hide();
if (file) {
file->close();
delete file;
file = nullptr;
}
reply->deleteLater();
reply = 0;
}
void MainWindow::on_pushButton_clicked()
{
url = ui->lineEdit->text();
QFileInfo info(url.path());
QString fileName(info.fileName());
qDebug()<<fileName;
if (fileName.isEmpty()) {
fileName = "index.html";
}
file = new QFile(fileName);
if (!file->open(QIODevice::WriteOnly)) {
delete file;
file = 0;
return;
}
startRequest(url);
ui->progressBar->setValue(0);
ui->progressBar->show();
}
Tel qu'il est utilisé ici, la fonction get () pour envoyer le réseau une demande, alors le signal QNetworkReply plusieurs objets et rainures personnalisés associés. Caractérisé en ce que readyRead (de la classe à chaque fois que de nouvelles données peuvent être lues) le signal QIODevice hérité, le signal d'émission sera, chaque fois que le réseau demandé téléchargement mise à jour de progression transmettre le signal téléchargement cours () est utilisée pour mettre à jour la barre de progression; la fin de chaque transpondeur transmet le traitement terminé () terminé le même signal que le signal de classe précédent programme de QNetworAccessManager () est appliquée, mais différents expéditeurs, les paramètres sont également différents.