Qt实战案例(32)——利用network相关类设计简单文件下载器实现HTTP通信

目录

    • 一、项目介绍
    • 二、项目基本配置
    • 三、UI界面设计
    • 四、主程序实现
      • 4.0 pro文件
      • 4.1 dialog.h
      • 4.2 dialog.cpp
    • 五、效果演示

一、项目介绍

利用network相关类(QNetworkReply、QNetworkAccessManager)实现简单文件下载器功能。

二、项目基本配置

新建一个Qt案例,项目名称为“DownloadTest”,基类选择“QDialog”,取消选中创建UI界面复选框,完成项目创建。

三、UI界面设计

无UI界面

四、主程序实现

4.0 pro文件

首先需要在两个pro文件中添加如下代码:

QT+=network

4.1 dialog.h

头文件中声明私有变量和一些槽函数:

public:
    void startRequest(QUrl url);

private:
    QLabel *Label;
    QLineEdit *TextLineEdit;
    QPushButton *DownLoadBtn;
    QVBoxLayout *mainLayout;
    QProgressBar *progressBar;

    QNetworkAccessManager *manager;
    QNetworkReply *reply;
    QUrl url;
    QFile *file;


private slots:
    void httpFinished();
    void httpReadyRead();
    void updateDataReadProgress(qint64,qint64);
    void DownLoad();

4.2 dialog.cpp

创建界面,设置相应布局:

    /*创建界面*/
    setWindowTitle(tr("File Download")) ;//设置窗体的标题
    //初始化各个控件
    Label = new QLabel(tr("请输入URL地址:"),this);
    TextLineEdit= new QLineEdit(this);
    DownLoadBtn = new QPushButton(tr("下载"),this);
    progressBar =new QProgressBar(this);
    //设置布局
    mainLayout= new QVBoxLayout(this);
    mainLayout->addWidget(Label);
    mainLayout->addWidget(TextLineEdit);
    mainLayout->addWidget(progressBar);
    mainLayout->addWidget(DownLoadBtn);

在没有下载文件时将进度条隐藏,连接按钮点击信号和对应的槽函数:

    progressBar->hide();//没有下载文件时将进度条隐藏
    manager = new QNetworkAccessManager(this);//创建QNetworkAccessManager实例,用来发送网络请求和接收应答
    connect(DownLoadBtn,SIGNAL(clicked()),this, SLOT(DownLoad()));//点击下载按钮对应槽函数

定义按钮点击对应的槽函数:

void Dialog::DownLoad()
{
    url = TextLineEdit->text();//获取文本
    QFileInfo info(url.path());
    QString fileName(info.fileName());//获取文件名称
    file = new QFile(fileName);//新建文件
    //如果无法打开
    if(!file->open(QIODevice::WriteOnly))
    {
        qDebug()<<"file open error";
        delete file;
        file = 0;
        return;
    }
    startRequest(url);//开始网络请求
    progressBar->setValue(0);//设置进度条初始值为0
    progressBar->show();    //显示进度条
}

网络请求函数,并将QNetworkReply对象的三个信号和对应的槽函数关联:

//网络请求函数
void Dialog::startRequest(QUrl url)
{

    reply = manager->get(QNetworkRequest(url));//发送网络请求
    connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));//每当有数据可以读取时,发送readyRead()信号
    connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64)));//每当网络请求的下载进度更新时,发送downloadProgress()信号用于更新进度条
    connect(reply,SIGNAL(finished()),this,SLOT(httpFinished()));//每当应答处理结束时,发送finish()信号
}

读取数据槽函数:

//槽函数——首先判断是否创建了文件,如果是则读取所有数据并写入文件中
void Dialog::httpReadyRead()
{
    if(file)file->write(reply->readAll());
}

设置进度条槽函数:

//设置进度条的最大值和当前值
void Dialog::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
{
    progressBar->setMaximum(totalBytes);
    progressBar->setValue(bytesRead);
}

下载完成槽函数:

//当下载完成时,重新隐藏进度条,删除reply和file对象
void Dialog::httpFinished()
{
    QMessageBox::information(this,"success","下载完成!");//提示
    progressBar->hide();
    file->flush();
    file->close();
    reply->deleteLater();
    reply = 0;
    delete file;
    file = 0;
}

五、效果演示

可以在QQ官网(https://im.qq.com/pcqq),右键“立即下载”,选中“复制链接”,将链接复制粗来:
https://dldir1.qq.com/qqfile/qq/PCQQ9.5.6/QQ9.5.6.28129.exe
然后在项目中输出链接,点击下载效果如下:
Qt实战案例(32)——利用network相关类设计简单文件下载器实现HTTP通信_第1张图片
下载完成后,可以在项目中找到该文件。

如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/77823351


ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

你可能感兴趣的:(Qt,qt,c++,网络,开发语言,http)