目录

官方解析

博主例子


官方解析

QNetworkAccessMangager类运行应用程序回复和接收网络包。

QNetworkAccessManager是一套API库,可以发包,设置代理,内存配置等。可以用于网络的应答(如http协议)。

如下面这个伪代码的栗子:

  QNetworkAccessManager *manager = new QNetworkAccessManager(this);connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

注意:这是一个异步的API。

当请求完成后,用户需要手动删除QNetworkReply对象,这里要注意,不应该在finished()信号过来的时候删除,而应该使用deleteLater()函数。

如果要并行处理,这里取决于平台,目前桌面平台支持6个并行。

如下面这个设置User-Agent的栗子:

  QNetworkRequest request;request.setUrl(QUrl("http://qt-project.org"));request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");QNetworkReply *reply = manager->get(request);connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),this, SLOT(slotError(QNetworkReply::NetworkError)));connect(reply, SIGNAL(sslErrors(QList<QSslError>)),this, SLOT(slotSslErrors(QList<QSslError>)));

博主例子

现在举一个下载http网站中web主页的例子,注意了是http的协议,不是https的协议!!!

程序运行截图如下:

程序结构如下:

源码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
class QNetworkAccessManager;
class QNetworkReply;
QT_END_NAMESPACEnamespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected slots:void replyFinished(QNetworkReply *reply);void netWorkReplyLoadProgress(qint64 received, qint64 total);void deleteNetWorkReply();private:Ui::Widget *ui;QNetworkAccessManager *m_manager;QNetworkReply *m_netWorkReply;
};#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QDebug>
#include <QNetworkReply>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);m_manager = new QNetworkAccessManager(this);connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));QUrl url("http://www.it1995.cn/");m_netWorkReply = m_manager->get(QNetworkRequest(url));connect(m_netWorkReply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(netWorkReplyLoadProgress(qint64,qint64)));}Widget::~Widget()
{delete ui;
}void Widget::replyFinished(QNetworkReply *reply)
{qDebug() << "replyFinished called!";qDebug() << "reply->readAll():" << QString::fromUtf8(reply->readAll());m_netWorkReply->deleteLater(); //此列子中 m_netWorkReply->deleteLater(); 与 delete m_netWorkReply; 没有什么区别
}void Widget::netWorkReplyLoadProgress(qint64 received, qint64 total)
{qDebug() << "received:" << received << "  total:" << total;
}void Widget::deleteNetWorkReply()
{qDebug() << "deleteNetWorkReply called!" << endl;
}

此处可以提升一下,在replyFinished这个函数里面,如果要把网页保存,那些这么做会,这个函数占用大量的CUP和内存(如果此处并行保存6个100MB的文件),在这里可以在QNetworkReply类中的readyRead这个信号关联后进行,因为网络传输数据太大,会被拆分,如下所示:

本例子下载的网页比较小,现象不明显,

把widget.cpp改成如下就明显了:

#include "widget.h"
#include "ui_widget.h"#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QDebug>
#include <QNetworkReply>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);m_manager = new QNetworkAccessManager(this);connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));QUrl url("http://www.it1995.cn/");m_netWorkReply = m_manager->get(QNetworkRequest(url));connect(m_netWorkReply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(netWorkReplyLoadProgress(qint64,qint64)));connect(m_netWorkReply, SIGNAL(readyRead()), this, SLOT(httpRead()));}Widget::~Widget()
{delete ui;
}void Widget::replyFinished(QNetworkReply *reply)
{qDebug() << "replyFinished called!";//qDebug() << "reply->readAll():" << QString::fromUtf8(reply->readAll());m_netWorkReply->deleteLater(); //此列子中 m_netWorkReply->deleteLater(); 与 delete m_netWorkReply; 没有什么区别
}void Widget::netWorkReplyLoadProgress(qint64 received, qint64 total)
{qDebug() << "received:" << received << "  total:" << total;
}void Widget::deleteNetWorkReply()
{qDebug() << "deleteNetWorkReply called!" << endl;
}void Widget::httpRead()
{qDebug() << "111";
}

运行截图如下:

此处把httpRead()修改如下,再看看运行结果:

void Widget::httpRead()
{qDebug() << m_netWorkReply->readAll();
}

运行截图和最开始的一样,可以用这个思路去保存文件!减少内存和CPU的使用!

这里来看看此时发送的Http数据包头:

修改源码,生成User-Agent属性,

添加这几行行即可:

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);m_manager = new QNetworkAccessManager(this);connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));QNetworkRequest request;request.setUrl(QUrl("http://www.it1995.cn/"));request.setRawHeader("User-Agent", "I am fine, fuck you");m_netWorkReply = m_manager->get(request);connect(m_netWorkReply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(netWorkReplyLoadProgress(qint64,qint64)));connect(m_netWorkReply, SIGNAL(readyRead()), this, SLOT(httpRead()));}

包头如下:

Qt文档阅读笔记-QNetworkAccessManager官方解析与实例相关推荐

  1. Qt文档阅读笔记-QSet官方解析及实例

    目录 官方解析 博主栗子 官方解析 QSet类是一个模板类,他是一个哈希表集合. QSet<T>是Qt的一个普通容器类.QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能 ...

  2. Qt文档阅读笔记-QtWebApp官方解析与实例(使用QtWebApp搭建HTTP服务器)

    目录 官方解析 博主例子 官方解析 QtWepApp是一个C++的http服务器,受到了java Servlets的启发,因为是Qt写的,所以有跨平台的支持. QtWebApp包含如下的组成部分:   ...

  3. Qt文档阅读笔记-QHostInfo官方解析与实例(根据Host获取IP)

    官方解析 QHostInfo提供了一个静态方法获取主机名: QHostInfo中有一个查找机制,可以根据IP找主机名,也可能工具主机名找IP,可以通过调用QHostInfo::lookupHost这个 ...

  4. Qt文档阅读笔记-QTcpServer官方解析与实例(使用QSocket创建简单的HTTP服务器)

    目录 官方解析 博主例子(做一个简单的HTTP服务器) 本例子中HTTP协议关键点 官方解析 QTcpServer类,提供TCP服务的基础: 这个类接受TCP连接,可以指定一个端口,也可以让其自动一个 ...

  5. Qt文档阅读笔记-QWebPage官方解析与实例

    目录 官方解析 博主例子 源码下载地址 官方解析 QWebPage提供一个视图对象和一个web页面: QWebPage提供了web页面的内容,各种设置(是否支持JavaScript等)和连接,它与QW ...

  6. Qt文档阅读笔记-QWebView官方解析与实例

    目录 背景 官方解析 博主例子 背景 最近发现某Qt项目,出现的效果杠杆的,在看某一小功能的时候,发现有个echart的东西,百度了发现,真的是一个新大陆,Qt加web编程,贼吉尔可怕. 在此发现使用 ...

  7. Qt文档阅读笔记-Q_CLASSINFO官方解析与实例

    官方解析 Q_CLASSINFO 这个宏为类提供额外的信息,要想获取这个Q_CLASSINFO这个信息要使用QObject::metaObject().Qt在Active Qt,Qt D-BUS以及Q ...

  8. Qt文档阅读笔记-stackUnder官方解析与实例

    目录 官方解析 博主例子 官方解析 这里可以配合raise()和lower()这两个函数来使用! 博主例子 用2个label,点击谁谁就浮在界面的最上面,很简单的代码,程序运行截图如下: 源码如下: ...

  9. Qt文档阅读笔记-QPropertyAnimation官方解析及实例

    目录 官方解析 博主例子 官方解析 QPropertyAnimation QPropertyAnimation类为Qt属性提供动画. QPropertyAnimation类可以修改Qt属性,从而达到动 ...

最新文章

  1. Android学习笔记之Android Studio添加新的Activity
  2. bs架构与cs架构的区别_Oracle vs Mysql--架构、sql查询执行流程及SQL解析顺序区别说明...
  3. eeglab教程系列(8)-数据叠加平均{2}绘制2D和3D图
  4. 每日一皮:经历过的Bug修复过程...
  5. idea svn配置_IDEA 导入svn项目实践
  6. ubuntu下搭建eclipse+tomcat的web开发环境
  7. php中函数的默认值,参数的顺序
  8. Java 内存 关系_发生在Java内存模型中的关系之前
  9. 中级工程师考试2019——地图制图与地理信息系统
  10. 微信公众号内嵌H5网页授权步骤
  11. Python selenium长截屏
  12. 数值计算之 共轭梯度法(1)线性共轭梯度法
  13. SOLD格雷母线是什么?
  14. mysql sql语句 查询文章表,评论表(根据评论表文章评论次数排序查询出文章count(),group,left join)
  15. EmguCv几种图像打开方法和转换
  16. 汇编学习 安装DOSBOX及debug.exe教程
  17. Linux 强制破解root密码 是root密码哦
  18. 【论文阅读】Realtime Robust Malicious Traffic Detection via Frequency Domain Analysis
  19. 特征工程:时间特征构造以及时间序列特征构造
  20. 复制物料(参考的MMCC想法)

热门文章

  1. C语言和C++语言在语法上面的部分区别
  2. 云开发是啥?看看它在编程导航项目的实践
  3. 在谈数据治理和数字化的时候,别忘了数据标准
  4. 需要符合互联网时代需求的《飞秋》
  5. 我看中国软件---问题篇
  6. C/C++入门的精髓!太全了吧,收藏夹的必备
  7. python django做网页论文_基于PythonDjango框架的多媒体发布系统
  8. mysql sql%rowcount_sql%rowcount 返回影响行数
  9. 画个火山图,标记下基因的名字
  10. 计算机系统操作工五级证件,计算机系统操作工国家职业标准.doc