réseau Qt programmation d'un téléchargement de fichiers réseau 2

 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.

Publié 257 articles originaux · louange gagné 22 · vues 90000 +

Je suppose que tu aimes

Origine blog.csdn.net/qq_24127015/article/details/104654809
conseillé
Classement