由于最近同時(shí)做兩個(gè)方向的東西,而且有一個(gè)方向比較緊迫午阵,沒有時(shí)間接著寫學(xué)習(xí)筆記享扔,感覺十分的不開心,抓緊時(shí)間再寫一點(diǎn)籽懦,ROS方面的可能暫時(shí)會(huì)慢一點(diǎn)
參考鏈接
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);
注意:測試時(shí)發(fā)現(xiàn),float插入到j(luò)son時(shí),會(huì)由于進(jìn)行了float到double的轉(zhuǎn)換過程中,數(shù)據(jù)精度會(huì)發(fā)生轉(zhuǎn)換,建議直接使用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中實(shí)例化:
m_accessManager= new QNetworkAccessManager(this);
發(fā)送函數(shù):
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();
}
寫得有點(diǎn)簡介,因?yàn)樽罱容^忙.
注意:這里可能會(huì)出現(xiàn)一個(gè)問題,就是還沒有發(fā)送完,對象就已經(jīng)被解析了,會(huì)導(dǎo)致發(fā)送失敗.解決這個(gè)問題的方法就是獲取發(fā)送完成的信號(hào),寫一個(gè)槽函數(shù)接收.
大概如下:
連接信號(hào):
connect(m_accessManager,&QNetworkAccessManager::finished,this,&post_data::quit_thread);
槽函數(shù),退出本子線程,刪除對象,我是在子線程里面處理的:
void post_data::quit_thread()
{
//qDebug()<<"des this thread";
this->deleteLater();
this->thread()->quit();
}