Qt通过QNetworkAccessManager实现Http get方法文件下载

前面已经实现了Qt的网络通信,这里在网络通信的基础上加上文件下载功能。相比与之前的例子添加了QFile与QProgressBar这两个类

dialog.h

[cpp]  view plain  copy
  1. #ifndef DIALOG_H  
  2. #define DIALOG_H  
  3.   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9. #include   
  10. #include   
  11. #include   
  12. #include   
  13. #include   
  14. /********************HTTP上传数据******************************/  
  15. /*************************************************************/  
  16. /*************************************************************/  
  17. /*************************************************************/  
  18. class Dialog : public QDialog  
  19. {  
  20.     Q_OBJECT  
  21.   
  22. public:  
  23.     Dialog(QWidget *parent = 0);  
  24.     ~Dialog();  
  25. protected slots:  
  26.     void httpDownload();  
  27.     void replyFinished(QNetworkReply*reply);  
  28.     void onDownloadProgress(qint64 bytesSent,qint64 bytesTotal);  
  29.     void onReadyRead();//  
  30.     void stop();//暂停,重新下载  
  31.   
  32. private:  
  33.     QPushButton *download_Btn;  
  34.     QPushButton *stop_Btn;  
  35.     QProgressBar *progressBar;  
  36.     QFile *file;  
  37.     QFileInfo fileInfo;  
  38.     QNetworkAccessManager *accessManager;  
  39.     QNetworkRequest request;  
  40.     QNetworkReply *reply;  
  41.     QVBoxLayout *layout;  
  42.     bool httpRequestAbort; //请求停止的标志位,false表示允许请求  
  43. };  
  44. #endif // DIALOG_H  


dialog.cpp

[cpp]  view plain  copy
  1. #include "dialog.h"  
  2. #include  
  3.   
  4. Dialog::Dialog(QWidget *parent)  
  5.     : QDialog(parent)  
  6. {  
  7.     download_Btn=new QPushButton("download");  
  8.     stop_Btn=new QPushButton("stop");  
  9.     progressBar=new QProgressBar;  
  10.     progressBar->hide();  
  11.   
  12.     layout=new QVBoxLayout();  
  13.     layout->addWidget(progressBar);  
  14.     layout->addWidget(download_Btn);  
  15.     layout->addWidget(stop_Btn);  
  16.   
  17.     setLayout(layout);  
  18.     httpRequestAbort=false;  
  19.     connect(download_Btn,SIGNAL(clicked()),this,SLOT(httpDownload()));  
  20.      connect(stop_Btn,SIGNAL(clicked()),this,SLOT(stop()));  
  21. }  
  22.   
  23. Dialog::~Dialog()  
  24. {  
  25.   
  26. }  
  27. void Dialog::httpDownload(){  
  28.   
  29.     QUrl url("http://mm.newhua.com/down/Samsung_USB_Drivers_for_Mobile_Phones_1.5.9.0.zip">
  30. http://mm.newhua.com/down/Samsung_USB_Drivers_for_Mobile_Phones_1.5.9.0.zip");  
  31.     fileInfo= url.path();  
  32.     file=new QFile(fileInfo.fileName());  
  33.     file->open(QIODevice::WriteOnly);//只读方式打开文件  
  34.     accessManager=new QNetworkAccessManager(this);  
  35.     request.setUrl(url);  
  36.     /******************设置http的header***********************/  
  37.    // request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");  
  38.    // request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");  
  39.    // request.setRawHeader("Content-Disposition","form-data;name='doc';filename='a.txt'");  
  40.     //request.setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());  
  41.   
  42.     reply=accessManager->get(request);//通过发送数据,返回值保存在reply指针里.  
  43.     connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//finish为manager自带的信号,replyFinished是自定义的  
  44.     connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT( onDownloadProgress(qint64 ,qint64 )));//download文件时进度  
  45.     connect((QObject *)reply, SIGNAL(readyRead()),this, SLOT(onReadyRead()));  
  46.     progressBar->setValue(0);  
  47.     progressBar->show(); 
  48. }  
  49. /***************响应结束**************************/  
  50. void Dialog::replyFinished(QNetworkReply *reply){  
  51.     //获取响应的信息,状态码为200表示正常  
  52.     QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);  
  53.     QByteArray bytes = reply->readAll();  //获取字节  
  54.     QString result(bytes);  //转化为字符串  
  55.     qDebug()<
  56.   
  57.     //无错误返回  
  58.     if(reply->error() == QNetworkReply::NoError)  
  59.     {  
  60.         download_Btn->setText("success");  
  61.         QByteArray bytes = reply->readAll();  //获取字节  
  62.         QString result(bytes);  //转化为字符串  
  63.   
  64.         qDebug()<
  65.     }  
  66.     else  
  67.     {  
  68.         //处理错误  
  69.          download_Btn->setText("failed");  
  70.     }  
  71.   
  72.     reply->deleteLater();//要删除reply,但是不能在repyfinished里直接delete,要调用deletelater;  
  73.   
  74. }  
  75.   
  76. /***********更新进度条*************/  
  77. void Dialog::onDownloadProgress(qint64 bytesSent, qint64 bytesTotal){  
  78.     progressBar->setMaximum(bytesTotal);  
  79.     progressBar->setValue(bytesSent);  
  80.   
  81. }  
  82.   
  83. void Dialog::onReadyRead(){  
  84.   
  85.     file->write(reply->readAll());  
  86.     download_Btn->setText("downloading");  
  87. }  
  88.   
  89. void Dialog::stop(){  
  90.     if(!httpRequestAbort)  
  91.     {  
  92.     reply->abort();//响应终止  
  93.     httpRequestAbort=true;  
  94.     stop_Btn->setText("start");  
  95. }  
  96.     else  
  97.     {   httpDownload();  
  98.         httpRequestAbort=false;  
  99.         stop_Btn->setText("stop");  
  100.      }  
  101.   
  102. }  

main.cpp

[cpp]  view plain  copy
  1. #include   
  2. #include "dialog.h"  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     Dialog w;  
  8.     w.show();  
  9.     return a.exec();  
  10. }  

你可能感兴趣的:(Qt学习资料)