前面已經實現了Qt的網絡通信,這裏在網絡通信的基礎上加上文件下載功能。相比與之前的例子添加了QFile與QProgressBar這兩個類
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QtGui/QDialog>
#include <QNetworkAccessManager>
#include <QFile>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QPushButton>
#include <QVBoxLayout>
#include <QIODevice>
#include <QFileInfo>
#include <QProgressBar>
/********************HTTP上傳數據******************************/
/*************************************************************/
/*************************************************************/
/*************************************************************/
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
protected slots:
void httpDownload();
void replyFinished(QNetworkReply*reply);
void onDownloadProgress(qint64 bytesSent,qint64 bytesTotal);
void onReadyRead();//
void stop();//暫停,重新下載
private:
QPushButton *download_Btn;
QPushButton *stop_Btn;
QProgressBar *progressBar;
QFile *file;
QFileInfo fileInfo;
QNetworkAccessManager *accessManager;
QNetworkRequest request;
QNetworkReply *reply;
QVBoxLayout *layout;
bool httpRequestAbort; //請求停止的標誌位,false表示允許請求
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include<QtDebug>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
download_Btn=new QPushButton("download");
stop_Btn=new QPushButton("stop");
progressBar=new QProgressBar;
progressBar->hide();
layout=new QVBoxLayout();
layout->addWidget(progressBar);
layout->addWidget(download_Btn);
layout->addWidget(stop_Btn);
setLayout(layout);
httpRequestAbort=false;
connect(download_Btn,SIGNAL(clicked()),this,SLOT(httpDownload()));
connect(stop_Btn,SIGNAL(clicked()),this,SLOT(stop()));
}
Dialog::~Dialog()
{
}
void Dialog::httpDownload(){
QUrl url("<a target=_blank href="http://mm.newhua.com/down/Samsung_USB_Drivers_for_Mobile_Phones_1.5.9.0.zip">http://mm.newhua.com/down/Samsung_USB_Drivers_for_Mobile_Phones_1.5.9.0.zip</a>");
fileInfo= url.path();
file=new QFile(fileInfo.fileName());
file->open(QIODevice::WriteOnly);//只讀方式打開文件
accessManager=new QNetworkAccessManager(this);
request.setUrl(url);
/******************設置http的header***********************/
// request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");
// request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");
// request.setRawHeader("Content-Disposition","form-data;name='doc';filename='a.txt'");
//request.setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());
reply=accessManager->get(request);//通過發送數據,返回值保存在reply指針裏.
connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//finish爲manager自帶的信號,replyFinished是自定義的
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT( onDownloadProgress(qint64 ,qint64 )));//download文件時進度
connect((QObject *)reply, SIGNAL(readyRead()),this, SLOT(onReadyRead()));
progressBar->setValue(0);
progressBar->show();
}
/***************響應結束**************************/
void Dialog::replyFinished(QNetworkReply *reply){
//獲取響應的信息,狀態碼爲200表示正常
QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
QByteArray bytes = reply->readAll(); //獲取字節
QString result(bytes); //轉化爲字符串
qDebug()<<result;
//無錯誤返回
if(reply->error() == QNetworkReply::NoError)
{
download_Btn->setText("success");
QByteArray bytes = reply->readAll(); //獲取字節
QString result(bytes); //轉化爲字符串
qDebug()<<result;
}
else
{
//處理錯誤
download_Btn->setText("failed");
}
reply->deleteLater();//要刪除reply,但是不能在repyfinished裏直接delete,要調用deletelater;
}
/***********更新進度條*************/
void Dialog::onDownloadProgress(qint64 bytesSent, qint64 bytesTotal){
progressBar->setMaximum(bytesTotal);
progressBar->setValue(bytesSent);
}
void Dialog::onReadyRead(){
file->write(reply->readAll());
download_Btn->setText("downloading");
}
void Dialog::stop(){
if(!httpRequestAbort)
{
reply->abort();//響應終止
httpRequestAbort=true;
stop_Btn->setText("start");
}
else
{ httpDownload();
httpRequestAbort=false;
stop_Btn->setText("stop");
}
}
main.cpp
#include <QtGui/QApplication>
#include "dialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}