qt http 下载文件

本文章介绍如何利用HTTP从网站上下载文件。在Qt网络编程中,需要用到协议,即HTTP。它是超文本传输协议,它是一种文件传输协议。对于HTTP就不多解释了。



Qt网络编程中,需要用到协议,即HTTP。它是超文本传输协议,它是一种文件传输协议。这一节中我们将讲解如何利用HTTP从网站上下载文件。使用的编程环境为Windows下基于Qt4.6.3的Qt Creator 1.3.1

一、最简单的实现。

1.我们新建Qt 4 Gui QApplication 。

工程名为“http”,然后选中QtNetwork模块,最后Base class选择QWidget。注意:如果新建工程时没有添加QtNetwork模块,那么就要手动在工程文件.pro中添加代码

  1. QT += network  

表明我们使用了网络模块。

2.我们在widget.ui文件中添加一个 Text Browser ,如下图。

Qt网络之HTTP编程

3..在widget.h中我们添加代码。

添加头文件:#include

私有变量private中:QNetworkAccessManager *manager;

私有槽函数private slots 中:void replyFinished(QNetworkReply *);

4.在widget.cpp文件中添加代码。

在构造函数中添加如下代码:

  1. manager new QNetworkAccessManager(this);  //新建QNetworkAccessManager对象 
  2. connect(manager,SIGNAL(finished(QNetworkReply*)),  //关联信号和槽 
  3.             this,SLOT(replyFinished(QNetworkReply*))); 
  4. manager->get(QNetworkRequest(QUrl(“http://www.yafeilinux.com”))); //发送请求 

然后定义函数:

  1. void Widget::replyFinished(QNetworkReply *reply)  //当回复结束后 
  2.     QTextCodec *codec QTextCodec::codecForName(“utf8″); 
  3.     //使用utf8编码,这样才可以显示中文 
  4.     QString all codec->toUnicode(reply->readAll()); 
  5.     ui->textBrowser->setText(all); 
  6.     reply->deleteLater();   //最后要释放reply对象 

5.运行效果如下。

Qt网络之HTTP编程

6.代码分析。

上面实现了最简单的应用HTTP协议下载网页的程序。QNetworkAccessManager类用于发送网络请求和接受回复,具体的,它是用QNetworkRequest类来管理请求,QNetworkReply类进行接收回复,并对数据进行处理。

在上面的代码中,我们使用了下面的代码来发送请求:

  1. manager->get(QNetworkRequest(QUrl(“http://www.yafeilinux.com”))); 

它返回一个QNetworkReply对象,这个下面再讲。我们只需知道只要发送请求成功,它就会下载数据。而当数据下载完成后,manager会发出finished()信号,我们对它进行了关联:

  1. connect(manager,SIGNAL(finished(QNetworkReply*)),  
  2.             this,SLOT(replyFinished(QNetworkReply*))); 

也就是说,当下载数据结束时,就会执行replyFinished()函数。在这个函数中我们对接收的数据进行处理:

  1. QTextCodec *codec QTextCodec::codecForName(“utf8″); 
  2. QString all codec->toUnicode(reply->readAll()); 
  3. ui->textBrowser->setText(all); 

这里,为了能显示下载的网页中的中文,我们使用了QTextCodec 类对象,应用utf8编码。

使用reply->readAll()函数就可以将下载的所有数据读出。然后,我们在textBrowser中将数据显示出来。当reply对象已经完成了它的功能时,我们需要将它释放,就是最后一条代码:

  1. reply->deleteLater(); 
 


二、功能扩展





通过上面的例子可以看到,Qt中编写基于HTTP协议的程序是十分简单的,只有十几行代码。不过,一般我们下载文件都想要看到下载进度。下面我们就更改上面的程序,让它可以下载任意的文件,并且显示下载进度。





1.我们更改widget.ui文件如下图。





Qt网络之HTTP编程





这里我们添加了一个Line Edit ,一个Label ,一个Progress Bar 和一个Push Button 
,它们的熟悉保持默认即可。我们在Push Button上点击鼠标右键,选择Go to slot ,然后选择clicked() 
,进入其单击事件槽函数,现在我们先不写代码。





在写代码之前,我们先介绍一下整个程序执行的流程:





开始我们先让进度条隐藏。当我们在Line 
Edit中输入下载地址,点击下载按钮后,我们应用输入的下载地址,获得文件名,在磁盘上新建一个文件,用于保存下载的数据,然后进行链接,并显示进度
条。在下载过程中,我们将每次获得的数据都写入文件中,并更新进度条,在接收完文件后,我们重新隐藏进度条,并做一些清理工作。





根据这个思路,我们开始代码的编写。





2.我们在widget.h文件中添加代码,完成后其部分内容如下。



Qt网络之HTTP编程

3.widget.cpp文件中的相关内容如下。

(1)构造函数中:
Qt网络之HTTP编程

我们在构造函数中先隐藏进度条。等开始下载时再显示它。

(2)下载按钮的单击事件槽函数。
 
Qt网络之HTTP编程 

这里我们先从界面中获取输入的地址,然后分解出文件名。因为地址中可能没有文件名,这时我们就使用一个默认的文件名。然后我们用这个文件名新建一个文件,这个文件会保存到工程文件夹的debug文件夹下。下面我们打开文件,然后进行链接,并显示进度条。
 

(3)链接请求函数。

  1. void Widget::startRequest(QUrl url)  //链接请求 
  2.     reply manager->get(QNetworkRequest(url)); 
  3.     //下面关联信号和槽 
  4.     connect(reply,SIGNAL(finished()),this,SLOT(httpFinished())); 
  5.     //下载完成后 
  6.     connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead())); 
  7.     //有可用数据时 
  8.     connect(reply,SIGNAL(downloadProgress(qint64,qint64)), 
  9.             this,SLOT(updateDataReadProgress(qint64,qint64))); 
  10.     //更新进度条 

Qt网络之HTTP编程

在上一个例子中我们就提到了manager->get(QNetworkRequest(url)),返回的是一个QNetworkReply对象,这里我们获得这个对象,使用它完成显示数据下载进度的功能。这里主要是关联了几个信号和槽。当有可用数据时,reply就会发出readyRead()信号,我们这时就可以将可用的数据保存下来。就是在这里,实现了数据分段下载保存,这样比下载完所有数据再保存,要节省很多内存。而利用reply的downloadProgress()信号,很容易就实现了进度条的显示。

(4)保存数据函数。

  1. void Widget::httpReadyRead()   //有可用数据 
  2.     if (file) file->write(reply->readAll());  //如果文件存在,则写入文件 

Qt网络之HTTP编程

这里当file可用时,将下载的数据写入文件。

(5)更新进度条函数。

  1. void Widget::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes) 
  2.  
  3.     ui->progressBar->setMaximum(totalBytes); //最大值 
  4.     ui->progressBar->setValue(bytesRead);  //当前值 

每当有数据到来时,都更新进度条。

(6)完成下载。

  1. void Widget::httpFinished()  //完成下载 
  2.     ui->progressBar->hide(); 
  3.     file->flush(); 
  4.     file->close(); 
  5.     reply->deleteLater(); 
  6.     reply 0; 
  7.     delete file; 
  8.     file 0; 

Qt网络之HTTP编程

这里只是当下载完成后,进行一些处理。

4.我们运行程序,效果如下。

下载网页文件:

Qt网络之HTTP编程

下载华军软件园上的劳拉方块游戏:

Qt网络之HTTP编程 

下载完成后可以看到工程文件夹中debug文件夹中的下载的文件。

Qt网络之HTTP编程

我们HTTP应用的内容就讲到这里,可以看到它是很容易的,也不需要你了解太多的HTTP的原理知识。关于相关的类的其他使用,你可以查看其帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值