hhtp一般文件下载并显示下载进度

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QUrl>

//类的前置声明,告诉编译器这是一个类允许编译通过
class QNetworkReply;
class QNetworkAccessManager;
class QFile;
class QLabel;
class QProgressBar;
class QPushButton;
class QLineEdit;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void startRequest(QUrl url);
private slots:
    void httpFinished();
    void httpReadyRead();
    void updateDataReadProgress(qint64 bytes_read, qint64 total_bytes);
    void onPushButtonClicked();
private:
    QNetworkAccessManager* manager_;
    QNetworkReply* reply_;
    QUrl url_;
    QFile* file_;

    QLabel* hint_message_label_;
    QLineEdit* input_message_lineedit_;
    QProgressBar* progress_bar_;
    QPushButton* download_button_;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QDebug>
#include <QtNetwork>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QProgressBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(800,600);

    hint_message_label_ = new QLabel(QString::fromLocal8Bit("请输入URL地址"),this);
    hint_message_label_->setGeometry(100,100,200,32);
    input_message_lineedit_ = new QLineEdit(this);
    input_message_lineedit_->setGeometry(100,132,200,32);
    progress_bar_ = new QProgressBar(this);
    progress_bar_->setMinimum(0);//最大最小值
    progress_bar_->setMaximum(100);
    progress_bar_->setValue(0);//当前值
    progress_bar_->setOrientation(Qt::Horizontal);//进度条水平放置
    progress_bar_->setGeometry(100,174,230,32);
    progress_bar_->hide();
    download_button_ = new QPushButton(QString::fromLocal8Bit("下载"),this);
    download_button_->setGeometry(300,132,32,32);
    connect(download_button_, &QPushButton::clicked, this, &MainWindow::onPushButtonClicked);

    manager_ = new QNetworkAccessManager(this);

}

MainWindow::~MainWindow()
{
}

void MainWindow::startRequest(QUrl url)
{
    //发送网络请求
    reply_ = manager_->get(QNetworkRequest(url_));
    //readyRead信号继承自QIODevice类,每当有新的数据可以读取时,都会发射该信号
    connect(reply_, &QNetworkReply::readyRead, this, &MainWindow::httpReadyRead);
    //网络请求的下载进度更新时发射信号
    connect(reply_, &QNetworkReply::downloadProgress, this, &MainWindow::updateDataReadProgress);
    //应答处理结束时发射信号
    connect(reply_, &QNetworkReply::finished, this, &MainWindow::httpFinished);
}

void MainWindow::httpFinished()
{
    progress_bar_->hide();
    if(file_){
        file_->close();
        delete file_;
        file_ = 0;
    }
    reply_->deleteLater();
    reply_ = 0;
}

void MainWindow::httpReadyRead()
{
    if(file_){
        file_->write(reply_->readAll());
    }
}

void MainWindow::updateDataReadProgress(qint64 bytes_read, qint64 total_bytes)
{
    progress_bar_->setMaximum(total_bytes);
    progress_bar_->setValue(bytes_read);
}

void MainWindow::onPushButtonClicked()
{
    url_ = input_message_lineedit_->text();
    QFileInfo info(url_.path());
    QString fileName(info.fileName());
    if(fileName.isEmpty()){
        fileName = "index.html";
    }
    file_ = new QFile(fileName);
    if(!file_->open(QIODevice::WriteOnly)){
        delete file_;
        file_ = 0;
        return;
    }
    startRequest(url_);
    progress_bar_->setValue(0);
    progress_bar_->show();
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值