Qt学习笔记网络(一)
Qt5 移除了QHttp是因为功能重复 用QNetworkAccessManager完全能搞定
新建一个控制台应用程序
看一下QNetworkAccessManager的帮助文档

需要添加Qt + =network

新建一个类
.h文件
#ifndef DOWNPAGES_H
#define DOWNPAGES_H
#include<QNetworkAccessManager>
#include <QObject> class DownPages : public QObject
{
Q_OBJECT
public:
explicit DownPages(QObject *parent = );
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";
}
再在这个基础上添加一个下载功能
.h文件
#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 = );
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 <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("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()<<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)
| 枚举值 | 描述 |
QIODevice::NotOpen |
未打开 |
QIODevice::ReadOnly |
以只读方式打开 |
QIODevice::WriteOnly |
以只写方式打开 |
QIODevice::ReadWrite |
以读写方式打开 |
QIODevice::Append |
以追加的方式打开,新增加的内容将被追加到文件末尾 |
QIODevice::Truncate |
以重写的方式打开,在写入新的数据时会将原有数据全部清除,游标设置在文件开头。 |
QIODevice::Text |
在读取时,将行结束符转换成 \n;在写入时,将行结束符转换成本地格式,例如 Win32 平台上是 \r\n |
QIODevice::Unbuffered |
忽略缓存 |
Qt学习笔记网络(一)的更多相关文章
- Qt学习笔记网络(URL和下载的功能都有)
http://www.cnblogs.com/li-peng/p/3656613.html
- qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...
- Qt学习笔记-Widget布局管理
Qt学习笔记4-Widget布局管理 以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,f ...
- QT学习笔记(一)——Helloworld
QT学习笔记(一)--Helloworld 一.调试的基本方法: Log调试法 --在代码中加入一定的打印语句 --打印程序状态和关键变量的值 断点调试法: --在开发环境中的对应代码行加上断点 -- ...
- qt学习笔记(七)之数据库简介(所有支持数据库类型的列表)
笔者最近用Qt写公司的考勤机.本来要求是要基于frameBuffer下用自己开发的easyGUI来进行上层应用开发,但是考虑到easyGUI提供的接口不是很多,就考虑用Qt来开发,顺带练练手. 废话不 ...
- Qt学习笔记(2)-利用StackWidget实现选项卡式页面
学习笔记第二篇,利用Qt实现选项卡式的页面,效果如图1.1-图1.3所示.程序实现的功能是通过点击状态栏实现不同页面的切换,实际上Qt中自带有Tab选项卡式的控件,本文利用StackWidge实现类似 ...
- Qt学习笔记(1) hello world
Qt的简介: Qt是一个跨平台的C++ GUI库实现,原本只是以为它只提供一些图形接口,看来我还是低估了它,采用文档Qt学习之路2开始学习,不知道这个文档是不是有点老了,管他呢,先了解下. 搭建环境: ...
- Qt学习之网络编程(一)
一些说明 学了有一段时间的python了,小项目做了不少,最近由于项目需要,所以要回归老本行了,开始重点突击C++和qt.python的网络爬虫系列有时间就更吧. 获取本机网络信息 在网络应用中,经常 ...
- 【Qt学习笔记】Qt+VS2010的配置
http://blog.csdn.net/jocyln9026/article/details/8575218 关于Qt Qt是1991年由Trolltech公司开发的一个跨平台的C++图形用户界面应 ...
随机推荐
- 腾讯Tinker初入门总结
- android ProGuard 代码混淆实现
1 修改project.properties,添加ProGuard配置项 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt: ...
- 抛弃NVelocity,来玩玩Razor
对于内容型,不易变动的东西我们都希望给它来个静态化,还有种情况就是比如新浪云不支持.net,为了能跑起我们的网站, 只能放些静态页面上面,外加jsonp来实现交互,我们知道.net中有很多模板引擎,但 ...
- mysql 5.5多实例部署【图解】
mysql5.5数据库多实例部署,我们可以分以下几个步骤来完成. 1. mysql多实例的原理 2. mysql多实例的特点 3. mysql多实例应用场景 4. mysql5.5多实例部署方法 一. ...
- 打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
---恢复内容开始--- ---恢复内容结束---
- 【故障处理】一次RAC故障处理过程
[故障处理]一次RAC故障处理过程 1.1 故障环境介绍 项目 source db db 类型 2节点RAC db version 11.2.0.1.0 db 存储 ASM OS版本及kernel版 ...
- Windows7 系统 CMD命令行,点阵字体不能改变大小以及中文乱码的问题
之前装了oracle 11g后,发现开机速度竟然奇葩的达到了3分钟.经过旁边大神指点,说是因为oracle某个(具体不清楚)服务,在断网的时候会不断的ping网络,导致速度变慢.然后就关服务呗,然后一 ...
- 烂泥:apache虚拟主机的学习与应用
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 要配置apache的虚拟主机,我们需要分以下几步进行: 1. 检查apache虚拟主机模块 2. 开启apache虚拟主机功能 3. httpd-vho ...
- AngularJS几个基础概念
作用域 应用的作用域是和应用的数据模型相关联的,同时作用域也是表达式执行的上下文.$scope对象是定义应用业务逻辑.控制器方法和视图属性的地方.作用域是视图和作用域之间的胶水.在应用将视图渲染并呈现 ...
- 理解 Linux 网络栈(3):QEMU/KVM + VxLAN 环境下的 Segmentation Offloading 技术(发送端)
本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...