Qt文档阅读笔记-QNetworkAccessManager官方解析与实例
目录
官方解析
博主例子
官方解析
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官方解析与实例相关推荐
- Qt文档阅读笔记-QSet官方解析及实例
目录 官方解析 博主栗子 官方解析 QSet类是一个模板类,他是一个哈希表集合. QSet<T>是Qt的一个普通容器类.QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能 ...
- Qt文档阅读笔记-QtWebApp官方解析与实例(使用QtWebApp搭建HTTP服务器)
目录 官方解析 博主例子 官方解析 QtWepApp是一个C++的http服务器,受到了java Servlets的启发,因为是Qt写的,所以有跨平台的支持. QtWebApp包含如下的组成部分: ...
- Qt文档阅读笔记-QHostInfo官方解析与实例(根据Host获取IP)
官方解析 QHostInfo提供了一个静态方法获取主机名: QHostInfo中有一个查找机制,可以根据IP找主机名,也可能工具主机名找IP,可以通过调用QHostInfo::lookupHost这个 ...
- Qt文档阅读笔记-QTcpServer官方解析与实例(使用QSocket创建简单的HTTP服务器)
目录 官方解析 博主例子(做一个简单的HTTP服务器) 本例子中HTTP协议关键点 官方解析 QTcpServer类,提供TCP服务的基础: 这个类接受TCP连接,可以指定一个端口,也可以让其自动一个 ...
- Qt文档阅读笔记-QWebPage官方解析与实例
目录 官方解析 博主例子 源码下载地址 官方解析 QWebPage提供一个视图对象和一个web页面: QWebPage提供了web页面的内容,各种设置(是否支持JavaScript等)和连接,它与QW ...
- Qt文档阅读笔记-QWebView官方解析与实例
目录 背景 官方解析 博主例子 背景 最近发现某Qt项目,出现的效果杠杆的,在看某一小功能的时候,发现有个echart的东西,百度了发现,真的是一个新大陆,Qt加web编程,贼吉尔可怕. 在此发现使用 ...
- Qt文档阅读笔记-Q_CLASSINFO官方解析与实例
官方解析 Q_CLASSINFO 这个宏为类提供额外的信息,要想获取这个Q_CLASSINFO这个信息要使用QObject::metaObject().Qt在Active Qt,Qt D-BUS以及Q ...
- Qt文档阅读笔记-stackUnder官方解析与实例
目录 官方解析 博主例子 官方解析 这里可以配合raise()和lower()这两个函数来使用! 博主例子 用2个label,点击谁谁就浮在界面的最上面,很简单的代码,程序运行截图如下: 源码如下: ...
- Qt文档阅读笔记-QPropertyAnimation官方解析及实例
目录 官方解析 博主例子 官方解析 QPropertyAnimation QPropertyAnimation类为Qt属性提供动画. QPropertyAnimation类可以修改Qt属性,从而达到动 ...
最新文章
- Android学习笔记之Android Studio添加新的Activity
- bs架构与cs架构的区别_Oracle vs Mysql--架构、sql查询执行流程及SQL解析顺序区别说明...
- eeglab教程系列(8)-数据叠加平均{2}绘制2D和3D图
- 每日一皮:经历过的Bug修复过程...
- idea svn配置_IDEA 导入svn项目实践
- ubuntu下搭建eclipse+tomcat的web开发环境
- php中函数的默认值,参数的顺序
- Java 内存 关系_发生在Java内存模型中的关系之前
- 中级工程师考试2019——地图制图与地理信息系统
- 微信公众号内嵌H5网页授权步骤
- Python selenium长截屏
- 数值计算之 共轭梯度法(1)线性共轭梯度法
- SOLD格雷母线是什么?
- mysql sql语句 查询文章表,评论表(根据评论表文章评论次数排序查询出文章count(),group,left join)
- EmguCv几种图像打开方法和转换
- 汇编学习 安装DOSBOX及debug.exe教程
- Linux 强制破解root密码 是root密码哦
- 【论文阅读】Realtime Robust Malicious Traffic Detection via Frequency Domain Analysis
- 特征工程:时间特征构造以及时间序列特征构造
- 复制物料(参考的MMCC想法)