Qt网络应用开发初步

  应用层的网络协议,如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开发及实例》

posted @ 2018-09-25 20:56  尚修能的技术博客  阅读(276)  评论(0编辑  收藏  举报