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++图形用户界面应 ...
随机推荐
- Asp.net MVC使用Model Binding解除Session, Cookie等依赖
上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖.其实这个也可以通 ...
- MVC6的内置ActionResult类型
BadRequestObjectResult,BadRequestResult http 400 bad request ChallengeResult ContentResult Creat ...
- Java Se : Java NIO(服务端)与BIO(客户端)通信
Java目前有三种IO相关的API了,下面简单的说一下: BIO,阻塞IO,最常用的Java IO API,提供一般的流的读写功能.相信学习Java的人,都用过. NIO,非阻塞IO,在JDK1.4中 ...
- cocos2d之json使用实例
前端使用: json管理器中函数解析: 对宠物技能map的定义: 宠物技能表单--数据的基础定义:
- windows下使用mysql双机热备功能
一. 准备工作 1. 准备两台服务器(电脑),接入局域网中,使互相ping得通对方 2. 两台服务器都安装mysql-server-5.1,必须保证mysql的版本一致 3. 假设,服务器A:192. ...
- linux批量删除进程
在虚拟机用脚本跑了几十个client程序用来测试服务器,然后发现参数设置错误,得重来,就傻眼了,不知道怎么关这么多client进程,总不能一个一个关.还好,学习一下,想出了以下的命令. ps -e ...
- Linux小技巧总结
1.fdisk创建磁盘分区不重启系统partprobe 使用fdisk工具只是将分区信息写到磁盘,如果需要mkfs磁盘分区则需要重启系统才能够读取到/dev/sda*,而使用partprobe则可以使 ...
- Linux中的SWAP交换分区
大多数 Linux 在系统安装时都会提醒并建议你划分一个 SWAP 交换分区,如果你是从 Windows 切换到 Linux 的新用户,兴许对这个 SWAP 会感到十分疑惑. SWAP 交换分区到底是 ...
- 用U盘制作启动盘后空间变小的恢复方法,清除U盘启动盘空间
先把u盘插好,运行cmd, 输入diskpart,回车, (输入list disk,回车,能看到磁盘大致情况,u盘一般是磁盘1) 再输入select disk 1,回车, 再输入clean,回车, 关 ...
- Qt回忆录之配置开发环境
光阴荏苒,用Qt开发已经一年多了.在Windows上开发GUI,最常用的莫过于MFC,WinForm,WPF以及Qt.MFC和Qt是基于C++,而WinForm和WPF一般是基于C#,当然在PC上基于 ...