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的原理知識。關於相關的類的其他使用,你可以查看其幫助


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM