日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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官方解析与实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。