Qt5 移除了QHttp是因为功能重复 用QNetworkAccessManager完全能搞定
新建一个控制台应用程序
看一下QNetworkAccessManager的帮助文档
需要添加Qt + =network
新建一个类
.h文件
#ifndef DOWNPAGES_H#define DOWNPAGES_H#include#include class DownPages : public QObject{ Q_OBJECTpublic: 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#include #include #include 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()< request().url(); int httpStatus = reply->attribute( QNetworkRequest::HttpStatusCodeAttribute).toInt(); QString reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString(); qDebug()<<"url"< < <<" "< errorString()<<" error "< error(); } } qDebug()<<"finished";}
再在这个基础上添加一个下载功能
.h文件
#ifndef DOWNPAGES_H#define DOWNPAGES_H#include#include #include class QNetworkReply;class DownPages : public QObject{ Q_OBJECTpublic: 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
.cpp文件
主要是添加 了这三个信号
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#include #include #include #include #include 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("http://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()< request().url(); int httpStatus = reply->attribute( QNetworkRequest::HttpStatusCodeAttribute).toInt(); QString reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString(); qDebug()<<"url"< < <<" "< errorString()<<" error "< 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()< 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: "< <<" current received : "< flush(); file->close(); delete file;}
file->open(QIODevice::Append)
枚举值 | 描述 |
QIODevice::NotOpen | 未打开 |
QIODevice::ReadOnly | 以只读方式打开 |
QIODevice::WriteOnly | 以只写方式打开 |
QIODevice::ReadWrite | 以读写方式打开 |
QIODevice::Append | 以追加的方式打开,新增加的内容将被追加到文件末尾 |
QIODevice::Truncate | 以重写的方式打开,在写入新的数据时会将原有数据全部清除,游标设置在文件开头。 |
QIODevice::Text | 在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n |
QIODevice::Unbuffered | 忽略缓存 |