用Qt实现基于网络请求的用户登录(一)


待解决的问题

  • 问题:用户联网登录
    1.提供登录界面(客户端),输入用户名和密码;
    2.将用户名和密码发送给服务器端,并进行相关查询,如果用户合法,返回用户信息;
    3.对返回的用户信息进行解析。
  • 假设:
    已经有了服务器和存储着用户名和密码数据库。服务器当接收到客服端的请求的时候,先在数据库中进行查询操作,然后返回用户信息。
    所以本文要实现的只是客户端请求信息的配置和对返回信息的解析。

涉及的知识点

  • 网络请求的基础知识
  • Json

需要解决的技术问题:

  • 在qt中如何设置网络请求
  • 在qt中如何生成和解析Json数据

一、网络请求的基础知识(暂略)

二、Qt中与网络请求相关类介绍

  • QNetworkAccessManager -

    Allows the application to send network requests and receive replies

  • QNetworkRequest

    Holds a request to be sent with QNetworkAccessManager

  • QNetworkReply

    Contains the data and headers for a request sent with QNetworkAccessManager

关系图:
这里写图片描述
(参考资料:http://blog.csdn.net/chenlong12580/article/details/7392766
我的理解是:QNetworkRequest设置网络请求的各个参数,QNetworkReply用于接收服务器返回的数据。而QNetworkAccessManager充当着一个中介的作用,设置post、get等方式将request发出去,然后监测服务器是否返回数据(存在QNetworkReply中),并将返回得来的reply委托给一个slot处理。
所以当进行网络请求的时候,要做的事情:

  1. 生成QNetworkRequest对象,设置请求头、请求所用API所需实参、url等信息;
  2. 准备解析处理QNetworkReply的slot;
  3. 生成QNetworkAccessManager,发送request,并将返回来的reply委托给该slot处理(实现上就是一条connect语句)

三、QJson的生成与解析

请先阅读:
http://www.w3school.com.cn/json/index.asp
http://www.w3school.com.cn/json/json_syntax.asp
无论是设置request所需的参数信息,还是返回来的reply,其数据均采用QJson的形式表示,所以要实现网络请求,QJson的生成和解析重要。
QJson是一个基于Qt的开发包用来将JSON数据解析成QVariant对象,JSON的数组将被映射为QVariantList实例,而其他对象映射为QVariantMap实例。
(一)与QJson相关的类

  • QJsonDocument

The QJsonDocument class provides a way to read and write JSON documents. QJsonDocument is a class that wraps a complete JSON document and can read and write this document both from a UTF-8 encoded text-based representation as well as Qt’s own binary format.

我的理解:text-based representation 应该是指形如[“Qt”,”version”,true]的表现形式,而这个整体就是一个基于text-based representation的JSON document了。这个整体在Qt中可以被存储在QByteArray中。QJsonDocument则是Qt中对JSON document进行读写的工具。

A document can be queried as to whether it contains an array or an object using isArray() and isObject(). The array or object contained in the document can be retrieved using array() or object() and then read or manipulated.

这里对应着Json中数组和对象的概念。相应地,Qt中提供与对象、数组相关的两个类:

  • QJsonObject

The QJsonObject class encapsulates a JSON object.A JSON object is a list of key value pairs, where the keys are unique strings and the values are represented by a QJsonValue.
You can convert the object to and from text based JSON through QJsonDocument.

  • QJsonArray

The QJsonArray class encapsulates a JSON array.A JSON array is a list of values. The list can be manipulated by inserting and removing QJsonValue’s from the array.You can convert the array to and from text based JSON through QJsonDocument.

这些类之间的关系可以表示如下:
这里写图片描述

上面介绍了Qt中与Json有关的一些类以及它们之间的关系,那么具体如何利用这些类来生成和解析Json呢?注意到,Qt的帮助文档中提到,无论是对QJsonObject而言,还是对QJsonArray而言,他们均可通过QJsonDocument与Json document进行转换。
下面就分别基于QJsonObject和QJsonArray介绍这些类的使用方法。下面使用的代码均来自http://blog.sina.com.cn/s/blog_a6fb6cc90101gnxm.html
代码理解:
1.展示了如何通过QJsonDocument使得QJsonObject、QJsonArray与Json document之间转换;
2. Json document 由QByteArray或者QString来表示;
3. QJsonParseError用于解析

(二)基于QJsonObject的Json生成与解析

1.生成Json

QJsonObject json;
json.insert("name", QString("Qt"));
json.insert("version", 5);
json.insert("windows", true);

QJsonDocument document;
document.setObject(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);

结果:

json_str为: {"name": "Qt","version": 5,"windows": true}

2.解析Json

QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error); 
if(json_error.error == QJsonParseError::NoError) 
{  
    if(parse_doucment.isObject())  
    {  
        QJsonObject obj = parse_doucment.object(); 
        if(obj.contains("name"))  
        {  
    QJsonValue name_value = obj.take("name");
    if(name_value.isString())
    {
        QString name = name_value.toString();
    }
} 
if(obj.contains("version"))  
{  
    QJsonValue version_value = obj.take("version");
    if(version_value.isDouble())
    {
int version = version_value.toVariant().toInt();
    }
} 
if(obj.contains("windows"))
{
    QJsonValue version_value = obj.take("windows");
    if(version_value.isBool())
    {
bool flag = version_value.toBool();
    } 
}
    }  
}  

结果:

name:Qt
version5
windows:true

(三)基于QJsonArray的的Json生成与解析
1.生成Json

QJsonArray json;
json.insert(0, QString("Qt"));
json.insert(1, QString("version"));
json.insert(2, true);

QJsonDocument document;
document.setArray(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);

结果:

json_str:["Qt","version",true]

2.解析Json

QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error); 
if(json_error.error == QJsonParseError::NoError) 
{  
    if(parse_doucment.isArray())  
    {  
QJsonArray array = parse_doucment.array(); 
int size = array.size();
for(int i=0; i
        {
    QJsonValue value = array.at(i);
    if(value.isString())
    {
QString name = value.toString();
    }
    else if(value.isBool())
    {
bool flag = value.toBool();
    }
}
    }
}

结果:

数组不同下标对应的值
0:Qt
1version
2true
### 回答1: 基于Qt的电子网络白板的设计与实现主要包括界面设计、网络通信能力以及白板功能的实现。 首先是界面设计,使用Qt的图形界面设计工具创建白板的界面,包括画布、工具栏、菜单栏等。通过布局管理器来管理界面元素,使界面简洁美观,并考虑不同分辨率和平台的适配性。 其次是网络通信能力的实现,基于Qt网络模块,使用TCP/IP协议进行服务器和客户端之间的通信。服务器端负责接收客户端发来的数据,并将其广播给其他客户端,客户端则根据接收到的数据进行界面更新。通过网络通信,实现用户在同一白板上进行协同编辑的功能。 最后是白板功能的实现,包括画线、画图形、撤销重做、文本编辑等。通过鼠标事件和键盘事件的处理,实现用户在白板上进行图形绘制和文本编辑的操作。同时,为了保证用户操作的同步性,需要对每个操作进行同步处理,确保操作在所有客户端上都可以看到。 综上所述,基于Qt的电子网络白板的设计与实现主要包括界面设计、网络通信能力以及白板功能的实现。通过合理的设计和实现,可以实现用户协同编辑的功能,提高团队协作效率,使得用户可以方便地共享和编辑信息。 ### 回答2: 基于Qt的电子网络白板的设计与实现是基于Qt框架开发的一款多人协作的电子白板应用。该应用可以在网络环境下实现多人同时进行实时绘图、写字和标注等操作,实现远程团队协作。 在设计方面,首先需要借助Qt的图形库,实现画板的基本绘制功能。通过使用Qt提供的绘图类,如QPainter、QPen和QBrush等,可以实现各种绘制操作,包括线条、形状和文字等。 其次,需要设计用户间的通信机制。可以利用Qt网络编程模块,使用TCP或UDP协议与服务器进行通信。服务器负责接收和分发用户的操作请求,将其广播给其他在线用户。这样,每个用户都可以看到其他用户的操作,并实时更新本地画面。 在实现方面,首先需要设计用户界面,包括画板区域、工具栏和用户列表等。通过Qt的界面设计工具,可以方便地创建和布局这些界面元素,使用户能够直观地操作和使用电子白板。 接着,需要定义用户的操作事件和信号槽机制。用户可以通过点击工具栏的按钮选择绘画工具,也可以通过手写板或鼠标进行绘制。每个操作事件都会发送相应的信号,触发对应的槽函数,实现绘制效果。 最后,需要建立网络连接和通信的逻辑。每个用户首先连接到服务器,服务器会分配一个唯一的用户ID。用户之间通过服务器进行消息的传递和同步,保证多人协作的实时性和一致性。 综上所述,基于Qt的电子网络白板的设计与实现需要考虑绘制功能、用户界面设计、用户通信机制和操作事件与信号槽机制。通过合理的架构设计和代码实现,可以实现一个高效稳定、易用便捷的电子网络白板应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值