您现在的位置是:网站首页> C/C++
项目实用代码收集
- C/C++
- 2022-04-08
- 1346人已阅读
项目实用代码收集
Qt的帮助文件:file:///F:/QtAll/Qt5.12.3/Docs/Qt-5.12.3/qtdoc/index.htm
如何在VC下使用USB-CAN II接口卡操作CAN通信
VideoWidget全屏显示
VideoWidget->showNormal ();
使用Qt通过Post发送Json格式数据
一、简介
1.任务目标
使用Qt通过post发送Json格式数据,或者以表单形式发送数据到服务器
2.环境简介
系统:Windows 10
Qt版本:5.7
二、内容准备
1、关于Qt
1.使用Post向服务器发送数据,使用到网络编程,需要在Pro文件中加入如下语句
QT += network
2.使用网络编程需要用到一下库文件,还有一些在本示例中用到的库文件如下
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QHttpMultiPart>
#include <QHttpPart>
#include <QUrlQuery>
3.Qt中使用Json数据需要用到一下库文件
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
三、Json数据介绍
1.Json中的基础数据类型:数字 字符串 布尔值
数字:int,double,float
字符串:string
布尔值:true,false
2.Json中的常见格式如下
2.1Json对象
通常以**{}**形式存在,数据可以当成pair类型的数据,有key对应着value,每一组key-value用逗号隔开,为方便演示写成多行,也可在一行内写完,例子如下
{
"userid":"123456",
"username":"Tom",
"age":25,
"score":95,
"pass":true
}
或者一行写完
{
“userid”:“123456”,“username”:“Tom”,“age”:25,"score":95,"pass":true
}
2.2Json数组
与C++中数组类似,Json中通常数组格式为数组名:[数据1,数据2…]
"hobby":["足球","羽毛球"]
1
2.3Json对象与Json数组组合
一个Json对象能包含多个Json数组
一个Json数组可以包含多个Json对象
{
"userid":"123456",
"username":"Tom",
"age":25,
"hobby":[
{"足球","羽毛球"},
{"书法","绘画"},
]
"score":95,
"pass":true
}
3.Qt中的Json
在Qt中有专门对Json的处理库,在5.x版本之后支持,4.x版本不支持,头文件参看上面头文件部分
Json对象在Qt中使用QJsonObject类
Json数组在Qt中使用QJsonArray类
在Qt中还有QJsonDocment类,该类可以当作对QJsonObject和QJsonArray的翻译,主要用来读写Json文档
4.表单数据
在Qt中,也可上传表单格式的数据到服务器,不仅可以传数据,也可以传送文件,例如音乐文件(本例使用mp3格式,具体格式可以根据需求改变),图片文件(本例使用jpeg格式,具体格式可以根据需求改变),具体使用方式以及使用格式参考下文代码示例
四、使用方法
1.新建一个类,类名定义为PostSendData,该类主要为实现发送Json数据,表单方式发送文件与接收Json返回的数据的功能,头文件与CPP文件如下
1.PostSendData头文件
class PostSendData: public QObject
{
Q_OBJECT
public:
PostSendData(QObject * parent = nullptr);
public:
PostSendData(QNetworkAccessManager* net_acess_manager, QUrl url, int request_type);
~PostSendData();
public:
void SendJsonData();//发送Json数据
void SendMusic();//发送音乐文件
void SendImage();//发送图片文件
public:
//解析Json数据
void getJson(QJsonObject &jsonObj);
private slots:
void finshedSlot(QNetworkReply* reply);//用来接收返回的Json数据
private:
QNetworkAccessManager* m_net_manager;
QUrl m_url;
int m_request_type;
}
2.PostSendData.cpp
#include "postsenddata.h"
PostSendData::PostSendData(QNetworkAccessManager *net_acess_manager, QUrl url, int request_type)
:m_net_manager(net_acess_manager),
m_url(url),
m_request_type(request_type)
{
connect(m_net_manager,
&QNetworkAccessManager::finished,
this,
&PostSendData::finshedSlot);
}
/*
* 示例要发送的Json数据 *
{
"userid":"123456",
"username":"Tom",
"age":25,
"hobby":["足球","羽毛球"]
"score":95,
"pass":true
}
*/
void PostSendData::SendJsonData()
{
QNetworkRequest netReq;
netReq.setUrl(this->m_url);
netReq.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));//post请求设置为json,才能发送josn格式文件
//创建一个Json对象,这个Json对象就是要发送的内容,展开成Json数据如上所示
QJsonObject jsonObj;
jsonObj.insert("userid","123456");
jsonObj.insert("username","Tom");
jsonObj.insert("age",25);
QJsonArray arryHobby;//hobby为一个Json数组,就创建一个QJsonArray对象,用来包含hobby的内容
arryHobby.append("足球");
arryHobby.append("羽毛球");
jsonObj.insert("hobby",arryHobby);//将hobby这个JsonArray加入到hobby这个JsonObject中
jsonObj.insert("score",95);
jsonObj.insert("pass",true);
//创建一个QJsonDocument类对象,jsonDoc可以将Json格式数据转换之后,使用post发送
QJsonDocument jsonDoc = QJsonDocument(jsonObj);
QByteArray post_data = jsonDoc.toJson(QJsonDocument::Compact);
m_net_manager->post(netReq,post_data);
}
void PostSendData::SendMusic()
{
//打开要发送的音乐文件,这里使用了一首大小为3M的歌曲,也可以具体使用时在指定要发送的音乐文件,此处方便演示直接使用绝对路径下的音乐文件
QString filePath = "H:/Code/QT/PostTest/bin/测试.mp3";
QFile* file = new QFile(filePath);
file->open(QIODevice::ReadOnly);
//发送音乐文件时,有可能还有附加的数据内容,可以预先定义好,也可发送时再定义
QString userid = "123456";
QString username = "Tom";
QNetworkRequest netReq;
netReq.setUrl(this->m_url);
/*
* 使用QHttpMultiPart创建一个multiPart对象,我们最后要发送的就是这multiPart对象
* multiPart中的内容,添加使用QHttpPart创建的对象
* QHttpPart类创建的对象,因为这里发送的有数据,也有音乐文件,所以使用from-data
*/
QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart useridPart;
useridPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"userid\""));
useridPart.setBody(userid.toUtf8());
QHttpPart usernamePart;
usernamePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"username\""));
usernamePart.setBody(username.toUtf8());
QHttpPart projectidPart;
projectidPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"projectid\""));
projectidPart.setBody("9");
//这里将要发送的文件放入mp3Part中
QHttpPart mp3Part;
mp3Part.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant(QString("form-data; name=\"file\";filename=\"测试.mp3\";")));
mp3Part.setBodyDevice(file);
//将所有想发送的内容放入multiPart中
multiPart->append(useridPart);
multiPart->append(usernamePart);
multiPart->append(projectidPart);
multiPart->append(mp3Part);
//发送
m_net_manager->post(netReq,multiPart);
}
void PostSendData::SendImage()
{
//与发送音乐文件类似,不过是改成图片文件
QString filePath = "H:/Code/QT/PostTest/bin/测试.jpeg";
QFile* file = new QFile(filePath);
file->open(QIODevice::ReadOnly);
QString userid = "123456";
QString username = "Tom";
QNetworkRequest netReq;
netReq.setUrl(this->m_url);
QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart useridPart;
useridPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"userid\""));
useridPart.setBody(userid.toUtf8());
QHttpPart usernamePart;
usernamePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"username\""));
usernamePart.setBody(username.toUtf8());
QHttpPart projectidPart;
projectidPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"projectid\""));
projectidPart.setBody("9");
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant(QString("form-data; name=\"file\";filename=\"测试.jpeg\";")));
imagePart.setBodyDevice(file);
multiPart->append(useridPart);
multiPart->append(usernamePart);
multiPart->append(projectidPart);
multiPart->append(imagePart);
m_net_manager->post(netReq,multiPart);
}
void PostSendData::getJson(QJsonObject &jsonObj)
{
switch (this->m_request_type)
{
case SENDDATA:
{
/*
* 返回Json数据示例,code:1-成功,2-失败,3-用户识别失败
* {"code":"1","msg":sucess,"result":true}
*/
qDebug() << "------------------发送数据的返回---------------------";
QString code = jsonObj.value("code").toString();
qDebug() << "code = " << code;
QString msg = jsonObj.value("msg").toString();
qDebug() << "msg = " << msg;
bool result = jsonObj.value("result").toBool();
break;
}
case SENDMUSIC:
{
/*
* 返回Json数据示例,code:1-成功,2-失败,3-用户识别失败
* {"code":"1","msg":sucess,"datas":[{"id":1,"music_name":"测试.mp3","music_id":456},]}
*/
qDebug() << "------------------发送音乐的返回---------------------";
QString code = jsonObj.value("code").toString();
qDebug() << "code = " << code;
QString msg = jsonObj.value("msg").toString();
qDebug() << "msg = " << msg;
//返回的Json数据中,datas是一个Json数组包含了Json对象,先把JsonObject转换成JsonValue
//JsonValue转换成JsonArray,再去循环读出JsonArray的内容
QJsonValue locationValue = jsonObj.value(QStringLiteral("datas"));
QJsonArray locationValueArray = locationValue.toArray();
for (int i = 0; i < locationValueArray.size(); i++)
{
QJsonValue locationArray = locationValueArray.at(i);
QJsonObject location = locationArray.toObject();
qDebug()<< "id = " << location["id"].toString();
qDebug()<< "music_name = "<< location["music_name"].toString();
qDebug()<< "music_id = " << location["music_id"].toString();
}
break;
}
case SENDIMAGE:
{
/*
*与发送音乐的返回类似
* 返回Json数据示例,code:1-成功,2-失败,3-用户识别失败
* {"code":"1","msg":sucess,"datas":[{"id":1,"image_name":"测试.jepg","image_id":456},]}
*/
qDebug() << "------------------发送图片的返回---------------------";
QString code = jsonObj.value("code").toString();
qDebug() << "code = " << code;
QString msg = jsonObj.value("msg").toString();
qDebug() << "msg = " << msg;
QJsonValue locationValue = jsonObj.value(QStringLiteral("datas"));
QJsonArray locationValueArray = locationValue.toArray();
for (int i = 0; i < locationValueArray.size(); i++)
{
QJsonValue locationArray = locationValueArray.at(i);
QJsonObject location = locationArray.toObject();
qDebug()<< "id = " << location["id"].toString();
qDebug()<< "music_name = "<< location["image_name"].toString();
qDebug()<< "music_id = " << location["image_id"].toString();
}
break;
}
}
}
void PostSendData::finshedSlot(QNetworkReply *reply)
{
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if(reply->error() == QNetworkReply::NoError)
{
QByteArray bytes = reply->readAll();
QJsonDocument jsonDoc = QJsonDocument::fromJson(bytes);
QJsonObject jsonObj = jsonDoc.object();
getJson(jsonObj);
}
reply->deleteLater();
}
3.在MainWindown中,我添加了三个按钮,用来发送不同的内容,MainWindown的头文件不在贴出,按钮使用界面直接转到槽clicked(),只贴出MainWindown.cpp供参考
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "postsenddata.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_sendData_clicked()
{
QNetworkAccessManager* m_netmanager_upwav = new QNetworkAccessManager(this);
QUrl senddataUrl = QUrl("http://SendData");
PostSendData* sendData= new PostSendData(m_netmanager_upwav,senddataUrl,0);
//0对应PostSendData中枚举类型,用途是接受不同的返回,解析Json数据时能找到解析的case,下面的1和2类似
sendData->SendJsonData();
}
void MainWindow::on_pushButton_sendMusic_clicked()
{
QNetworkAccessManager* m_netmanager_sendmusic = new QNetworkAccessManager(this);
QUrl sendmusicUrl = QUrl("http://SendMusic");
PostSendData* sendMusic= new PostSendData(m_netmanager_sendmusic,sendmusicUrl,1);
sendMusic->SendMusic();
}
void MainWindow::on_pushButton_sendImage_clicked()
{
QNetworkAccessManager* m_netmanager_sendimage = new QNetworkAccessManager(this);
QUrl sendimageUrl = QUrl("http://SendImage");
PostSendData* sendImagec= new PostSendData(m_netmanager_sendimage,sendimageUrl,2);
sendImagec->SendImage();
}
后记说明
参考了很多文档,基础使用文档很多,综合起来使用的还是比较少,要不就是需要收费,所以这算是一个在Qt中使用Post方式,向http发送Json数据,以及使用表单形式发送文件+数据的一个综合例程,仅供参考,如有问题请指出,一起探讨进步。关于Qt中对于Json以及网络接口的使用,参考Qt中的文档,还有许多使用方式,接口函数可以调用
从零开始用QT编写一个Android投屏、PC反控软件
ToMobile是一款Android投屏、反控工具
部分功能参考了scrcpy。
基本功能:
实时显示 Android 设备屏幕
实时键鼠控制Android设备
屏幕录制、摄像头录制
截图
无线连接
多设备连接与批量操作
全屏显示
窗口置顶
安装apk:拖拽apk到显示窗口即可安装
传输文件:拖拽文件到显示窗口即可发送文件到 Android 设备
后台录制:只录制屏幕,不显示界面
剪贴板同步: 在计算机和设备之间同步剪贴板:
Ctrl + c将设备剪贴板复制到计算机剪贴板;
Ctrl + Shift + v将计算机剪贴板复制到设备剪贴板;
Ctrl + v 将计算机剪贴板作为一系列文本事件发送到设备
同步设备声音到电脑
下一篇:打印实现