Qt5 移除了QHttp是因為功能重複 用QNetworkAccessManager完全能搞定
建立一個控制台應用程式
看一下QNetworkAccessManager的幫助文檔
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauIDOxEDMwIzMwcTM1EDMx8CX0ADNxAjMvwVN5UjM0MzLcl2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)
建立一個類
.h檔案
#ifndef DOWNPAGES_H
#define DOWNPAGES_H
#include<QNetworkAccessManager>
#include <QObject>
class DownPages : public QObject
{
Q_OBJECT
public:
explicit DownPages(QObject *parent = 0);
void Do_Download();
signals:
public slots:
void replyFinished(QNetworkReply*);
private :
QNetworkAccessManager *manager;
};
#endif // DOWNPAGES_H
我們聲明了一個 QNetworkAccesManager
在.cpp裡我們把它初始化并把它的finshed信号關聯槽
并判斷狀态是如果 是200也就是請求正常狀态把頁面輸出
.cpp檔案
#include "downpages.h"
#include <QNetworkRequest>
#include<QNetworkReply>
#include<QDebug>
#include<QTextCodec>
DownPages::DownPages(QObject *parent) :
QObject(parent)
{
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
QUrl url;
//url.setUrl("http://www.cnblogs.com/a/b");
//url.setUrl("http://www.baidu.com/");
url.setUrl("http://www.sibaieteco.com/");
//url.setUrl("www.abaibduc.com");
QNetworkRequest request(url);
manager->get(request);
}
void DownPages::Do_Download()
{
}
/*
* 請求完成
*
*
*/
void DownPages::replyFinished(QNetworkReply * reply)
{
//檢視是否有錯誤
switch(reply->error())
{
//如果沒有錯誤把頁面輸出
case QNetworkReply::NoError:
qDebug()<<"no error";
{
QTextCodec * cod=QTextCodec::codecForName("utf-8");
QString str=cod->toUnicode(reply->readAll());
qDebug()<<str;
}
break;
case QNetworkReply::ContentNotFoundError:
{
QUrl failedUrl;
failedUrl = reply->request().url();
int httpStatus = reply->attribute(
QNetworkRequest::HttpStatusCodeAttribute).toInt();
QString reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString();
qDebug()<<"url"<<failedUrl <<httpStatus<<" "<<reason;
}
break;
default:
{
qDebug()<<"Have error"<<reply->errorString()<<" error "<<reply->error();
}
}
qDebug()<<"finished";
}
再在這個基礎上添加一個下載下傳功能
#ifndef DOWNPAGES_H
#define DOWNPAGES_H
#include<QNetworkAccessManager>
#include <QObject>
#include <QFile>
class QNetworkReply;
class DownPages : public QObject
{
Q_OBJECT
public:
explicit DownPages(QObject *parent = 0);
void Do_Download();
signals:
public slots:
void replyFinished(QNetworkReply*);
void readyRead();
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void downFinished();
private :
QNetworkAccessManager *manager;
QNetworkReply * managerReply;
QFile *file;
};
#endif // DOWNPAGES_H
主要是添加 了這三個信号
managerReply = manager->get(request);
connect(managerReply,SIGNAL(readyRead()),this,SLOT(readyRead()));
connect(managerReply,SIGNAL(downloadProgress(qint64,qint64)),
this,SLOT(downloadProgress(qint64,qint64)));
connect(managerReply,SIGNAL(finished()),this,SLOT(downFinished()));
readyRead()開始下載下傳資料
DownloadProgress顯示下載下傳的進度
還有一個finished
#include "downpages.h"
#include <QNetworkRequest>
#include<QNetworkReply>
#include<QDebug>
#include<QTextCodec>
#include<QFileInfo>
#include<QDir>
DownPages::DownPages(QObject *parent) :
QObject(parent)
{
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
QUrl url;
//url.setUrl("http://www.cnblogs.com/a/b");
//url.setUrl("http://www.baidu.com/");
//url.setUrl("http://www.sibaieteco.com/");
url.setUrl("https://files.cnblogs.com/li-peng/WPFMultLanguageDemo.rar");
QNetworkRequest request(url);
managerReply = manager->get(request);
connect(managerReply,SIGNAL(readyRead()),this,SLOT(readyRead()));
connect(managerReply,SIGNAL(downloadProgress(qint64,qint64)),
this,SLOT(downloadProgress(qint64,qint64)));
connect(managerReply,SIGNAL(finished()),this,SLOT(downFinished()));
}
void DownPages::Do_Download()
{
}
void DownPages::replyFinished(QNetworkReply * reply)
{
switch(reply->error())
{
case QNetworkReply::NoError:
qDebug()<<"no error";
{
QTextCodec * cod=QTextCodec::codecForName("utf-8");
QString str=cod->toUnicode(reply->readAll());
//qDebug()<<str;
}
break;
case QNetworkReply::ContentNotFoundError:
{
QUrl failedUrl;
failedUrl = reply->request().url();
int httpStatus = reply->attribute(
QNetworkRequest::HttpStatusCodeAttribute).toInt();
QString reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString();
qDebug()<<"url"<<failedUrl <<httpStatus<<" "<<reason;
}
break;
default:
{
qDebug()<<"Have error"<<reply->errorString()<<" error "<<reply->error();
}
}
qDebug()<<"finished";
}
void DownPages::readyRead()
{
QFileInfo fileinfo(managerReply->url().path());
QString thefileName = fileinfo.fileName().isEmpty()?"index.html":fileinfo.fileName();
QString thePath ="E:/Test/Down/";
//qDebug()<<thePath;
QDir createfile;
bool exist = createfile.exists(thePath);
if(!exist)
{
createfile.mkpath(thePath);
}
thePath +=thefileName;
file=new QFile(thePath);
// if(file->open(QIODevice::Append))
// {
// file->write(managerReply->readAll());
// file->flush();
// file->close();
// }
if(file->open(QIODevice::Append ))
{
file->write(managerReply->readAll());
qDebug()<<"flu";
file->flush();
}
//delete file;
}
void DownPages::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
qDebug()<<"Total: "<<bytesTotal<<" current received : "<<bytesReceived;
}
void DownPages::downFinished()
{
file->flush();
file->close();
delete file;
}
file->open(QIODevice::Append)
枚舉值 | 描述 |
| 未打開 |
| 以隻讀方式打開 |
| 以隻寫方式打開 |
| 以讀寫方式打開 |
| 以追加的方式打開,新增加的内容将被追加到檔案末尾 |
| 以重寫的方式打開,在寫入新的資料時會将原有資料全部清除,遊标設定在檔案開頭。 |
| 在讀取時,将行結束符轉換成 \n;在寫入時,将行結束符轉換成本地格式,例如 Win32 平台上是 \r\n |
| 忽略緩存 |
作者:李鵬
出處:http://www.cnblogs.com/li-peng/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。