Qt示例-Download

6 篇文章 0 订阅
4 篇文章 0 订阅

简介

  一个简单的http下载器,可以批量下载文件,保存到指定目录,类似浏览器的下载功能

演示

在这里插入图片描述

代码解释

  这次的下载器代码比较核心代码比较简单,暂时只使用到了如下几个类

QNetworkReply
QNetworkRequest
QNetworkAccessManager
  1. 使用get方法请求下载文件

    //调用该函数可以实现下载功能
    ReplyData DownloadManager::doDownload(const QUrl &url)
     {
         QNetworkRequest request(url);
         //QNetworkAccessManager使用get请求数据 
         QNetworkReply *reply = manager->get(request);
         //将返回的QNetworkReply和要下载的文件路径返回给ui类,方便进度条处理
         ReplyData date = {saveFileName(url), reply};
         return date;
     }
    
  2. 检查下载进度

    //QMap<QNetworkReply*, QProgressBar*>  replyMap;
    //
     ReplyData replyData = manager.doDownload(url);
     QProgressBar* proBar = new QProgressBar;
     //设置进度条显示文字
     proBar->setFormat(replyData.fileName + "已下载%p%");
     //当下载数据更新时QNetworkReply会发出downloadProgress信号
     connect(replyData.reply, &QNetworkReply::downloadProgress,
     		this, &Win::downloadProgress);
    
  3. 保存数据

    //将数据保存在本地
    //QNetworkAccessManager下载完毕后会发出finished信号,接收该信号,保存数据
    
    connect(manager, SIGNAL(finished(QNetworkReply*)),
    		SLOT(downloadFinished(QNetworkReply*)));
    
    void DownloadManager::downloadFinished(QNetworkReply *reply)
    {
        QUrl url = reply->url();
        QString filename = saveFileName(url);
        qDebug()<<filename<<endl;
        if (saveToDisk(filename, reply))
        {
                qDebug()<<"保存成功"<<endl;
        }
        reply->deleteLater();//要使用deleteLater进行删除,否则有问题
    }
    
    bool DownloadManager::saveToDisk(const QString &filename, QIODevice *data)
    {
        QFile file(filename);
        if (!file.open(QIODevice::WriteOnly)) {
            return false;
        }
        file.write(data->readAll());
        file.close();
        return true;
    }
    

注意事项

  1. 在接收到QNetworkAccessManagerfinished信号后,删除QNetworkReply对象时要使用deleteLater()方法
  2. 要保证程序运行期间QNetworkAccessManager没有被析构,否则无法接收finished信号
  3. 在线程中处理QNetworkAccessManagerfinished信号时,要启用消息循环,否则无法接收finished信号
  4. linux下换行符为\n, windows下换行符为\r\n

源码

源代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值