Qt网络应用开发初步

时间:2021-03-19 00:46:17

  应用层的网络协议,如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();
}

运行结果如下:

Qt网络应用开发初步

参考资料:《Qt5开发及实例》