应用层的网络协议,如HTTP/FTP/SMTP等简称“应用协议”,他们运行在TCP/UDP之上,从Qt5开始,已经不再分别提供QHttp类,QFtp类,应用层的编程使用QNetworkRequest,QNetworkReply和QNetworkAccessManager这几个高层次的类代替。
1)网络请求由QNetworkRequest类来表示,作为与请求有关的信息的统一容器,在创建请求对象时指定的URL决定了请求使用的协议,目前支持HTTP,FTP和本地文件URLs的上传和下载。
2)QNetworkAccessManager类用于协调网络操作,每当一个请求创建后,该类用来调度它,并发信号来报告进度。
3)对于网络请求的应答则使用QNetworkReply类表示,它会在请求被完成调度时由QNetworkAccessManager创建
DEMO
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QNetworkAccessManager>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonValue>
#include <QDebug>
#include <QJsonArray>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QNetworkAccessManager *manager;
Ui::MainWindow *ui;
private slots:
void replyFinished(QNetworkReply *);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
manager=new QNetworkAccessManager(this);
connect(manager,SIGNAL(finished(QNetworkReply*)),
this,SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://www.baidu.com")));
}
void MainWindow::replyFinished(QNetworkReply *reply)
{
QString all=reply->readAll(); //all数据只用来显示
ui->textBrowser->setText(all);
reply->deleteLater();
}
MainWindow::~MainWindow()
{
delete ui;
}
首先创建一个QNetworkAccessManager类的实例,它用来发送网络请求和接收应答。然后关联了管理器的finished()信号和槽,每当网络应答结束时都会发送这个信号。最后用get()函数来发送一个网络请求,网络请求使用QNetworkRequest类表示,get()函数返回一个QNetworkReply对象。
槽函数部分
void MainWindow::replyFinished(QNetworkReply *reply)
{
QString all=reply->readAll(); //all数据只用来显示
ui->textBrowser->setText(all);
reply->deleteLater();
}
因为QNetworkReply继承自QIODe'vice类,所以可以像操作一般的I/O设备一样操作该类。这里使用readALL()函数来读取所有的应答数据。在完成数据的读取后,需要使用deleteLater()删除reply()对象。
main.cpp
#include "mainwindow.h"
#include <QtNetwork>
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
运行结果如下:
参考资料:《Qt5开发及实例》