Qt 基于http的网络文件下载

1.需要用到的类

QNetworkAccessManager类用于协调网络操作,负责发送网络请求,创建网络响应

QNetworkReply类表示网络请求的响应。在QNetworkAccessManager发送一个网络请求后创建一个网络响应。它提供了以下信号:

finished():完成后发出信号

readyRead():有数据读的数据发出信号

downloadProgress():表示网络操作进度的信号,有bytesRead和totalBytes两个参数,表示已读取字节数和总字节数

2.运行界面

Qt 基于http的网络文件下载_第1张图片

首先点击默认当前路径按钮,获取运行程序的当前路径

在地址栏输入下载的文件地址,例:下载网易云音乐logo图片,地址如下

http://p3.music.126.net/tBTNafgjNnTL1KlZMt7lVA==/18885211718935735.jpg

3.源码

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_btnDown_clicked()
{
    QString url = ui->leUrl->text().trimmed();

    if(url.isEmpty())
        return;

    QUrl newUrl = QUrl::fromUserInput(url);
    if(!newUrl.isValid())
        return;

    QString tempDir = ui->leSavePath->text().trimmed();
    if(tempDir.isEmpty())
        return;

    QString fullFileName = tempDir+newUrl.fileName();
    if(QFile::exists(fullFileName))
        QFile::remove(fullFileName);

    downFile = new QFile(fullFileName);
    if(!downFile->open(QIODevice::WriteOnly))
        return;

    ui->btnDown->setEnabled(false);

    reply = networkManager.get(QNetworkRequest(newUrl));
    connect(reply,&QNetworkReply::finished,this,&Widget::on_finished);
    connect(reply,&QNetworkReply::readyRead,this,&Widget::on_readyRead);
    connect(reply,&QNetworkReply::downloadProgress,this,&Widget::on_downloadProgress);
}

void Widget::on_btnDefaultPath_clicked()
{
    //缺省路径
    QString curPath = QDir::currentPath();

    QDir dir(curPath);
    QString sub = "temp";
    dir.mkdir(sub);

    ui->leSavePath->setText(curPath + "/" + sub + "/");
}

void Widget::on_finished()
{
    QFileInfo fileInfo;
    fileInfo.setFile(downFile->fileName());
    downFile->close();
    delete downFile;
    reply->deleteLater();
    reply = nullptr;

    ui->btnDown->setEnabled(true);
}

void Widget::on_readyRead()
{
    downFile->write(reply->readAll());
}

void Widget::on_downloadProgress(qint64 bytesRead, qint64 totalBytes)
{
    ui->progressBar->setMaximum(totalBytes);
    ui->progressBar->setValue(bytesRead);
}

你可能感兴趣的:(Qt进阶,qt,http,文件下载,网络)