HTTP 编程(下载文件)

本文介绍了一个使用Qt框架实现网络文件下载的应用案例。具体步骤包括隐藏进度条、获取URL并创建文件、构造网络请求、发送请求并连接信号与槽来处理进度更新及文件写入操作。此外还展示了如何在下载完成后关闭进度条、刷新文件缓冲区并关闭文件。

思路:

(1)、刚开始时隐藏进度条

(2)、按下下载按钮后,首先取得URL,用来创建文件,并且构造请求

(3)、发送请求,连接信号与槽(槽是准备读数据、更新进度条、相应结束的槽)

(4)、读取相应信息并且写入文件

(5)、重新隐藏进度条,关闭文件,删除应答等

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QFile>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
    QNetworkAccessManager *manager;
    QFile* file;
    QNetworkReply * reply;//注意要定义成指针的形式

private slots:
    void onBtnClicked();
    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
    void readyRead();
    void finished();
};

#endif // MAINWINDOW_H
MainWindow.h
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QUrl>
#include <QString>
#include <QFileInfo>
#include <QFile>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    manager = new QNetworkAccessManager(this);
    ui->progressBar->hide();
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onBtnClicked()));
}

void MainWindow::onBtnClicked()
{
    QString text = ui->lineEdit->text();
    QUrl url(text);

    QFileInfo info(url.path());
    QString fileName(info.fileName());
    file = new QFile(fileName);

    if( ! file->open(QIODevice::WriteOnly))
    {
        qDebug() << "error";
        delete file;
        file = 0;
        return;
    }

    QNetworkRequest request;//1.构建请求
    request.setUrl(url);

    reply = manager->get(request);//2.发送请求
    connect(reply, SIGNAL(readyRead()), this, SLOT(readyRead()));
    connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64)));
    connect(reply, SIGNAL(finished()), this, SLOT(finished()));

}

void MainWindow::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
    ui->progressBar->setMaximum(bytesTotal);
    ui->progressBar->setValue(bytesReceived);
}
void MainWindow::readyRead()
{
    if(file)
    {
        file->write(reply->readAll());//3.处理应答
        ui->progressBar->show();
    }
}
void MainWindow::finished()
{
    ui->progressBar->hide();
    file->flush();
    file->close();
    reply->deleteLater();
}

MainWindow::~MainWindow()
{
    delete ui;
}
MainWindow.cpp
#include <QtGui/QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    
    return a.exec();
}
main.cpp

 

转载于:https://www.cnblogs.com/gui-lin/p/6492137.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值