zoukankan      html  css  js  c++  java
  • 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开发及实例》

  • 相关阅读:
    内置函数二
    通信的几个程序
    TCP协议和UDP协议
    异常处理
    logging模块
    网络编程一些概念
    hashlib
    序列化模块
    time,sys,os模块
    random模块
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/9703143.html
Copyright © 2011-2022 走看看