我是靠谱客的博主 野性小蘑菇,最近开发中收集的这篇文章主要介绍【QT】QT网络编程简介一、QT网络编程简介二、快速实践,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

【QT】QT网络编程简介

  • 一、QT网络编程简介
    • 1. 重要的类
    • 2. 网络体系
    • 3. 一个GET所需要的组件
  • 二、快速实践
    • 案例一:创建一个GET请求
      • 1. 在类内部定义网络编程所需的类
      • 2. new一个QNetworkAccessManager类
      • 3. 将Manager的finish信号和接受槽相关联
      • 4. 编写接收槽函数
      • 5. 发送请求
      • 6. 注销资源
      • #:一个tip
      • #:GET函数封装流程
    • 案例二:中文编码问题

一、QT网络编程简介

QT自身有着完善的网络管理体系,既支持底层协议,也支撑上层封装。
本文介绍三个常用类和实践代码

1. 重要的类

  1. 管理类
    QNetworkAccessManager 网络接入管理类,使用该管理类可以方便管理网络请求等
  2. 请求类
    QNetworkRequest 请求类,用于发送网络请求
  3. 相应类
    QNetworkReply 相应类,用于处理相应信息

2. 网络体系

一个通用的网络体系大概步骤如下

  1. 通过管理类创建一个管理器
  2. 通过QUrl确认链接和其它请求信息
  3. 通过QNetworkRequest进行请求操作
  4. 通过管理类发送请求并关联接收
  5. 处理接收

3. 一个GET所需要的组件

  1. 通常一个GET请求需要QUrl进行构建请求链接
  2. 通过Request来封装请求
  3. 通过管理类发送请求
  4. 通过Reply处理相应

二、快速实践

案例一:创建一个GET请求

1. 在类内部定义网络编程所需的类

private:
    QNetworkAccessManager* manager;	
    QNetworkReply* reply;
private slots:
    void finishSlot(QNetworkReply*reply);

QNetworkAccessManager是管理类
QNetworkReply是相应类
finishSlot是接收相应的槽

2. new一个QNetworkAccessManager类

 MainWindow::manager = new QNetworkAccessManager(this);

3. 将Manager的finish信号和接受槽相关联

connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(finishSlot(QNetworkReply*)));

4. 编写接收槽函数

void MainWindow::finishSlot(QNetworkReply *reply)
{
    ui->strLab->setText("This is a text");
    QTextCodec *codec = QTextCodec::codecForName("utf8");
    QString all = codec->toUnicode(reply->readAll());
    ui->strLab->setText(all);
}

5. 发送请求

manager->get(QNetworkRequest(QUrl("http://localhost:8080/")));

6. 注销资源

reply->deleteLater();

不同于new运算符的是,QT使用了智能销毁的函数deleteLater,这个函数会自动判断合适的时机将资源销毁。
QT有着较为优秀的内存回收机制,当对象数量有对象树结构化的支持时,相关对象会按照对象树的规则自动销毁,避免了内存溢出的情况。
不过QT在内存管理方面需要编者着重注意内存问题,例如越界检查和野指针。

#:一个tip

当你的QT内存管理出现问题时往往会和当前系统其它使用QT编写的应用程序发生冲突,尤其是Windows平台下的一系列第三方服务。
经验来讲,野指针和内存越界的问题是引起蓝屏的主要根源。有时也会引起搜狗输入法的程序冲突。

#:GET函数封装流程

  1. const char* 封装为QUrl
  2. QUrl封装为QNetworkRequest
  3. QNetworkRequest作为get参数发送

案例二:中文编码问题

QTextCodec *codec = QTextCodec::codecForName("utf8");
QString all = codec->toUnicode(reply->readAll());

因为reply对象返回的是字节序,字节数组,是完全按照http返回的二进制数据
因此如果想要得到中文或者其他形式的编码,则需要进行二次编码
使用QTextCodec进行编码
编码结果得到的是QString

最后

以上就是野性小蘑菇为你收集整理的【QT】QT网络编程简介一、QT网络编程简介二、快速实践的全部内容,希望文章能够帮你解决【QT】QT网络编程简介一、QT网络编程简介二、快速实践所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部