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_Hmain.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笔记-Q3DScatter及QCus
- 下一篇: Spring官方阅读笔记-@Contro