由于最近同时做两个方向的东西,而且有一个方向比较紧迫,没有时间接着写学习笔记,感觉十分的不开心,抓紧时间再写一点,ROS方面的可能暂时会慢一点
参考链接
1 包含头文件
#include <QNetworkReply>
#include <QNetworkRequest>
2 生成json
QJsonObject json_in;
QJsonObject json;
QJsonDocument docum;
QByteArray data_json;
json_in.insert("addr",addr);
json_in.insert("num",num);
json_in.insert("status",status);
json.insert("code",200);
json.insert("result",json_in);
docum.setObject(json);
data_json=docum.toJson(QJsonDocument::Compact);
注意:测试时发现,float插入到json时,会由于进行了float到double的转换过程中,数据精度会发生转换,建议直接使用double.
3 插曲:解析json
void websocketserver::Re_con_cmd(QString message)
{
QString addr;
int num;
int con_switch;
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(message.toUtf8(), &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isObject())
{
QJsonObject obj = parse_doucment.object();
if(obj.contains("action"))
{
QJsonValue action_value = obj.take("action");
if(action_value.toString()=="control")
{
if(obj.contains("addr"))
{
QJsonValue addr_value = obj.take("addr");
addr = addr_value.toString();
cmd[4]=Qchrtouchar(addr.at(0))*16+Qchrtouchar(addr.at(1));
cmd[5]=Qchrtouchar(addr.at(2))*16+Qchrtouchar(addr.at(3));
//qDebug()<<"addr"<<cmd[4]<<cmd[5];
}
if(obj.contains("num"))
{
QJsonValue num_value = obj.take("num");
num = num_value.toInt();
cmd[8]=num;
}
if(obj.contains("switch"))
{
QJsonValue con_switch_value = obj.take("switch");
con_switch = con_switch_value.toInt();
cmd[10]=con_switch;
}
emit control_cmd(addr,cmd);
}
}
}
}
4 POST
在头文件中声明:
QNetworkAccessManager *m_accessManager;
在cpp中实例化:
m_accessManager= new QNetworkAccessManager(this);
发送函数:
void post_data::post_to_server(QByteArray data,QString addr)
{
QUrl url(addr);
QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
QNetworkReply *reply = m_accessManager->post(request,data);
qDebug()<<reply->error();
}
写得有点简介,因为最近比较忙.
注意:这里可能会出现一个问题,就是还没有发送完,对象就已经被解析了,会导致发送失败.解决这个问题的方法就是获取发送完成的信号,写一个槽函数接收.
大概如下:
连接信号:
connect(m_accessManager,&QNetworkAccessManager::finished,this,&post_data::quit_thread);
槽函数,退出本子线程,删除对象,我是在子线程里面处理的:
void post_data::quit_thread()
{
//qDebug()<<"des this thread";
this->deleteLater();
this->thread()->quit();
}