# C++网络请求(get,post,上传图片)与QML混合编程

Qt之QNetworkAccessManager 实现FTP文件上传/下载功能 Qt5移除了QFtp API,原因是其实现质量,QNetworkAccessManager可以用来提供ftpurl的上传下载操作; 但是美中不足的是QNetworkAccessManager没有提供list()、cd()、remove()、mkdir()、rmdir()、rename() 和 rawCommand()等操作。 先来看看操作结果: ... 阅读详情

C++网络请求(get,post,上传图片)与QML混合编程

文章主要分两个大模块:C++模块和qml模块;包含了Qt下网络请求QNetworkAccessManager,QNetworkRequest,QNetworkReply类库,以及响应机制:信号与槽,同时还兼容了QML与C++信息的传递以及数据类型的转换;本人刚学QT不到一个月且第一次写文章给大家分享,如有不好的地方欢迎大家留言给出宝贵的意见。好了,啰嗦了半天,接着就看正文吧:

  • get实现
  • post实现
  • 上传图片
  • 获取网络返回结果并传递结果给qml
  • qml与C++传递过程的数据转换
  • qml使用C++网络类

get实现

这里两个参数其实分别是手机号码和请求接口名
RequestBaseStr_REGIST为宏定义请求接口地址

void CCNetWorkRequest::CCRequest_GET(QString param, QString interfaStr)
{
   requestURL_Str = RequestBaseStr_REGIST;
   requestURL_Str.append(interfaStr);
   requestURL_Str.append(param);
   qDebug()<<"req_url:"<<requestURL_Str;
   //此处为返回给qml界面其所发出的请求信息(主要便于测试验证请求参数是否正确)
   emit reqParamsReturn(requestURL_Str);
   _netWorkRequest.setUrl(QUrl(requestURL_Str));
   //通过manager直接调用get方法将request传递过去就可以了!
   _netWorkManager->get(_netWorkRequest);
}

post实现

这里设计时第一个参数为qml传递过来的所需请求所有参数的json字符,第二个参数同上,接口名称

void CCNetWorkRequest::CCRequest_POST(QString param, QString interfaStr)
{
   requestURL_Str = RequestBaseStr_REGIST;
   requestURL_Str.append(interfaStr);
   //这里主要将qml传递过来的json转换为请求data
   transData = CCQmlStrToByteArray(param);
   //校验传递的参数是否正确
   if(transData.isNull())
   {
       emit reqErrorReturn("请求参数错误!");
       return;
   }
   _netWorkRequest.setUrl(QUrl(requestURL_Str));
   //设置请求头,必加
   _netWorkRequest.setRawHeader("Content-Type","application/json;charset=UTF-8");
   qDebug()<<"send data:"<<transData;
   //请求前将所发请求信息返回qml界面显示(只为测试)
   emit reqParamsReturn(requestURL_Str.append(transData));
   _netWorkManager->post(_netWorkRequest,transData);
}

上传图片

void CCNetWorkRequest::CCRequest_UPLOAD(QString param, QString interfaStr, QString cPath)
{
    requestURL_Str = RequestBaseStr_USER;
    requestURL_Str.append(interfaStr);
    //这里主要先将上传文件所带参数先转换为jsonobject为后面做准备
    QJsonObject paramObject = CCQstringToJsonobject(param);
    if(paramObject.isEmpty())
    {
        emit reqErrorReturn("图片请求参数错误!");
        return;
    }
//    qDebug()<<"to_object_res:"<<paramObject;
  //将文件通过base64转换为Qstring;
    QString imageStr = CCImageToBass64(cPath);
    qDebug()<<"ima:"<<imageStr;
    if(imageStr==NULL)
    {
        emit reqErrorReturn("文件路径错误!");
        return;
    }
    //将图片信息插入之前转换的jsonobject里面去完善整个请求参数
    paramObject.insert("fileData",imageStr);
    transData = QJsonDocument(paramObject).toJson();
    _netWorkRequest.setUrl(QUrl(requestURL_Str));
    _netWorkRequest.setRawHeader("Content-Type","application/json;charset=UTF-8");
//    qDebug()<<"send data:"<<transData;
    emit reqParamsReturn(requestURL_Str);
    _netWorkReply = _netWorkManager->post(_netWorkRequest,transData);
    connect(_netWorkReply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(CCRequest_UpLoadError(QNetworkReply::NetworkError)));
 //建立网络请求信号槽     
 connect(_netWorkReply,SIGNAL(uploadProgress(qint64,qint64)),this,SLOT(CCRequest_OnUploadProgress(qint64,qint64)));
}

获取网络返回结果并传递结果给qml

//构造函数初始化时实例化manager,并建立finished对应信号与槽
 _netWorkManager = new QNetworkAccessManager(this);
   connect(_netWorkManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(CCRequest_Flished(QNetworkReply*)));

//接收网络请求返回完成结果,通过reply转换为string返回qml
void CCNetWorkRequest::CCRequest_Flished(QNetworkReply *rel)
{
    QString rel_str;
    if (rel->error())
    {
        rel_str = rel->errorString();
    }
    else
    {
        rel_str = rel->readAll();
    }
    //发送收到结果信号给qml (rel_str即为结果json值,具体的自己去转换)
    emit reqFlishedReturn(rel_str);

    qDebug()<<"flished rel:"<<rel_str;

}
//图片上传进度
void CCNetWorkRequest::CCRequest_OnUploadProgress(qint64 bytesSent, qint64 bytesTotal)
{
     qDebug()<<"recive sent:"<<bytesSent<<"\n recive total:"<<bytesTotal;
}
void CCNetWorkRequest::CCRequest_UpLoadError(QNetworkReply::NetworkError errorCode)
{
     qDebug()<<"recive error:"<<errorCode;
}

qml与C++传递过程的数据转换

将qml传递的参数转换为请求所需data,其他转换由于较多,这里就不写了,文章结尾会附上源码地址。

QByteArray CCNetWorkRequest::CCQmlStrToByteArray(QString qmlStr)
{
     qDebug()<<"qmlStr :"<<qmlStr;
    QJsonDocument jsonDocument = QJsonDocument::fromJson(qmlStr.toLocal8Bit().data());
    if(jsonDocument.isNull())
    {
        qDebug()<<"===>"<<qmlStr.toLocal8Bit().data();
        return NULL;
    }
    QByteArray byte_array = jsonDocument.toJson(QJsonDocument::Compact);

//    QByteArray bytes = qmlStr.toLatin1();   QString转Qbyte
    qDebug()<<"str to byte :"<<byte_array;
    return byte_array;
}

qml使用C++网络类

#include <QGuiApplication>
#include <QQmlApplicationEngine>
//导入C++类库
#include "CCNetWorkRequest.h"

int main(int argc, char *argv[])
{


    QGuiApplication app(argc, argv);
    //注册为qml可使用库
    qmlRegisterType<CCNetWorkRequest>("zm.Net.CCRequest",1,0,"CCRequest");
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}
具体qml界面和导入qml系统库一样导入你注册的C++类库
import zm.Net.CCRequest 1.0
-----------------------------------------
//实例化网络请求类
  CCRequest
    {
      id:ccRequest;

    }


    function getValidStr()
    {
    //设置请求验证码参数
        var num = Math.floor(Math.random()*10000000+10000000);

        var phone = "158"+num;
        console.log("ran:"+phone);
        var interfaStr = "register/getVerificationCode/"
        ccRequest.setReqNum(1);
        //直接调用c++类封装的get请求
        ccRequest.CCRequest_GET(phone,interfaStr);
    }

总结:

本文使用了几个关键点,一是网络请求相关操作,二,是信号与槽机制,三,是qml与c++混合编程。可能类似文章较多,在这里给大家说一声:献丑了,具体不明白的可下载源码查看;最后只说一点,对初学QT的同学,本文及源码绝对可以给你很大启发和知识,代码编写也绝对很规范。

源码地址:http://download.youkuaiyun.com/download/samson_shu/9775836

QT qml的入门使用 结构如下: main.cpp代码: #include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine 阅读详情

相关推荐

c++与qml的交互数据传递及其实时刷新

将temp绑定信号tempParaChanged();在temp值改变的时候,发出这个绑定的信号,就可以实现参数的更新。这样只要通过绑定信号,我们就可以在任何时候更新我们想要更新的参数,而不需要重新赋值。将Text的文本绑定c++的参数temp,在c++端的test.cpp文件中。每次调用paraUpdate()函数时都会更新text文本的值。1.写一个继承于QObject的类,并注册。2.qml端导入,并实例化。

qq_59578055的博客 2885

C++ Qt进阶之复杂控件自定义

要想成为高级程序员,必须精通C++。大量第三方开源库使用C++编写。开发移动应用的一些核心功能必须使用C C++。Qt是大公司大量使用的跨平台c++库,号称工具软件之王。Qt作为一个如此高效,跨平台的GUI开发框架,如何快速掌握其精髓?写出高质量,复杂的交互?这是困扰很多中高级开发人员,很头疼的一个问题。在这个课程中,我们会给出非常好的答案。 为什么很多同学学了很多年编程,看了很多书,教程,还是不会写,只能在网络上copy代码?或者自己没有动手能力,遇到稍微复杂的东西就束手无策?为什么那些高效率学习的人,能在三五天内掌握Qt,并开始写软件,做项目?一个类似Qt这样的开发框架,几千个API,如何学习?为什么我们同学学习了一两年Qt C++还糊里糊涂,有的人只需要几天时间就掌握Qt的精髓?通过这个系列课程的学习,让学员深入理解一套GUI开发框架,编程思想。并将这套思想应用到任何平台的开发中,例如iOS,Android。 理解这套编程思想,日后可以运用于快速学习任何一套新的东西,框架。 通过这一系列课程的训练,希望大家能达到无招胜有招的境界。达到以后遇到任何客户端软件,拍着胸脯说,我闭着眼睛都能写出来的境界。

QPost:基于QML的HTTP测试工具(模仿Postman)

QPost 基于QML的HTTP测试工具(模仿Postman)

关于C++中获取图片传递给qml (Qt5.4)

.h#ifndef MYIMAGEPROVIDER_H #define MYIMAGEPROVIDER_H#include <QQuickImageProvider> #include <QQuickWindow> #include <QImage>class MyImageProvider : public QQuickImageProvider { public: explicit My

xi__q的专栏 4040

【最新】C++ http 服务端,接收来自http post form_data文件(图片)源码

【最新】C++ http post form_data传文件源码,【最新】C++ http post form_data传文件源码,【最新】C++ http post form_data传文件源码

AD20/Altium designer——元器件批量命名与编号的高效技巧

本文详细介绍了在AD20/Altium Designer中实现元器件批量命名与编号的高效技巧。通过解析核心的“原理图标注”功能,从基础全局操作到进阶的按模块分区、利用标识符及合并BOM等智能方法,帮助硬件工程师彻底告别手动编号,大幅提升设计效率与文档规范性,并融入了一套完整的实战工作流。

whisky的博客 567

[C++][PHP]C++使用liburl上传图片,PHP接受图片并保存,再下发展示图片的网址

1.index.php <?php if(!empty($_GET['Img'])) { //判断当前是不是扫码模式,扫码后当前网页根据扫描的内容加载图片 //这里的图片没有重新命名,全叫Send.jpg $ImgPath="<img src='Image/".$_GET['Img']."/"."Send.jpg' />"; echo $ImgPath; echo "<title>测试</title

PangCoder的博客 768

Linux内存压力测试工具【memtester】详且精

对Linux下的压力测试工具memtester有一个比较人性化的概述,以及避坑心得。

weixin_44118923的博客 1万+

image控件显示图片_C++封装图像控件给QML使用

“ 阅读本文大概需要3分钟图片的操作在日常软件使用过程中还是挺多的,我们知道,使用 Qt 中操作图片还是很容易的。一般我们在QML中要操作一幅图片,需要借助 Image 来实现,如果需要对图像进行特殊复杂的处理,那么就显得力不存心了。原理我们知道,QML中要绘制显示图片,一般都是使用 Canvas,另一种方法就是使用 QQuickPainteritem来实现,本次自定义控件采用的就是第二种方式。小...

weixin_39902870的博客 1041

ECC密码的加密和解密(附带代码实现)

ECC,全称Elliptic Curve Cryptography,是椭圆曲线密码学。这是一种公钥加密技术,其安全性基于椭圆曲线离散对数问题,被广泛应用于信息安全领域。ECC的主要优势在于,相较于RSA和DSA等其他传统的公钥密码体系,它能够在提供相同安全级别的情况下,使用更短的密钥,从而减少计算量和存储空间的需求。例如,一个256位的ECC密钥提供的安全性可以与3072位的RSA密钥或DSA密钥相媲美。ECC的主要应用领域包括SSL安全证书、安全电子邮件、移动设备安全、物联网设备安全等。

xixixi7777的博客 8268

影刀RPA进阶:Excel多条件筛选与数据提取实战

本文详细介绍了如何利用影刀RPA实现Excel多条件筛选与数据提取的自动化。通过拆解文本、数值、日期及颜色筛选等核心指令,并结合实战案例,指导用户构建稳健的销售数据提取机器人,从而高效处理复杂数据报表,提升工作效率。

onion的博客 528

Qt C++发送图片到QML显示

前言 开发Qt应用时,想把QImage发送到QML端通过Image组件显示出来,这种场景主要用在例如在C++端调用android系统接口截图然后发送到QML端显示,或者C++端QWidget截图然后让QML界面中显示。要想实现该功能,需要用到一个重要的类QQuickImageProvider,这是专门从C++端提供图片到QML显示的。 正文 先来看看Qt的示例 首先定义一个类并继承...

luoyayun361的专栏 8647

基于CY7C68013A芯片的USB2.0设计

基于FPGA的USB2.0读写控制项目简介CY7C68013A芯片介绍CY7C68013A芯片读写时序控制CY7C68013A芯片读写代码USB2.0的测试结果结束语 项目简介 我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不...

zhangningning1996的博客 1万+

curl post表单上传文件(C++)

最近测试如何上传文件到服务器。原来传照片一致通过binary 形式传文件,或者把图片base64编码传图片。一致没有用form-data 表单形式发送数据,今天尝试下如何使用libcurl提供的API上传文件。 Sample code: #include &amp;amp;amp;lt;iostream&amp;amp;amp;gt; #include &amp;amp;amp;lt;curl/curl.h&amp;amp;amp;gt; #include &

Andy Tools 1万+

世界职业院校技能大赛商贸赛道项目参考逐字稿一

商贸赛道“智选优品”—基于大数据与AI驱动的跨境电商平台项目参考逐字稿您订阅本专栏后即可`永久享有所有文章的查阅权`,希望我们更新的参考资料能帮助到您。如果您需要我们团队赋能培训可联系我(企业一线工程师及国一获奖选手在线培训支持:每周直播精讲(可回放,支持弹幕答疑)、代码Review+技术售后(拉群随时问,12h内响应)、④路演PPT+答辩话术一对一点评,评委视角提前彩排、适合:中职/高职赛项选手、指导老师带队、校企工作室、整校打包另谈(可开发票))

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1581

【新版系统架构】系统架构设计师教程全篇知识点提炼

信息系统的5个基本功能:输入、存储、处理、输出和控制信息系统的发展:诺兰模型:初始阶段、传播阶段、控制阶段、集成阶段、数据管理阶段、成熟阶段信息系统的分类:传统的信息系统分为:业务(数据)处理系统、管理信息系统(MIS)、决策支持系统(DSS)、专家系统(ES)、办公自动化系统(OAS)等5类信息系统的生命周期:1、产生阶段2、开发阶段(总体规划、系统分析、系统设计、系统实施、系统验收阶段)3、运行阶段4、消亡阶段信息系统建设原则:1、高层管理人员介入原则。

分享技术干货和灵感、推荐新书和好玩的项目、分享Java面试题 1万+

c++ curl实现post请求图片用法 - removebg移除背景

removebg 移除背景API 1.Image URL用法 注意file打开方式必须二进制写入 "wb" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <curl/curl.h> #pragma warning(disable:4996) using namespace std; #define POSTURL "https://api.remov.

Greless的后花园 893

22、预条件技术:矩阵分解与多项式预条件器

本文系统介绍了预条件技术中的不完全分裂法、多项式预条件器和近似逆预条件器。内容涵盖矩阵分解的基本原理、不完全LU和Cholesky分解的实现方法、基于填充水平和阈值策略的改进技术,以及多项式和近似逆预条件器的数学基础与应用。通过算法流程图和表格对比,展示了各类预条件器的适用场景与优缺点,同时探讨了其在迭代求解中的关键作用和未来发展方向。

theta的博客 94

C++:C语言实现HTTP的GET和POST请求

转载自:C++:C语言实现HTTP的GET和POST请求 - 方方和圆圆 - 博客园 C++:C语言实现HTTP的GET和POST请求 阅读目录  HTTP请求和IP/TCP  实现GET请求  实现POST请求:  参考: 回到顶部   HTTP请求和IP/TCP   所谓的HTTP协议是基于IP/TCP协议的, 所以要获取远端的html数据只要创建socket对象就足够了;   HTTP是基于IP/TCP加上了网络请求的固定格式, 比如: 运行下面代码 metho...

自主无人机 PX4 ROS SLAM 路径规划 MVS等技术分享 7362

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VS2015:C++使用libcurl发送POST请求

环境: win10 VS2015 curl-7.61.1 步骤: 准备好libcurl.lib、libcurl.dll 搭建好项目目录,并放入curl头文件、libcurl.lib、libcurl.dll,创建好空的.cpp文件 cmake编译该项目 打开.sln文件,进行编程 生成解决方案并执行 一、搭建项目目录结构     新建文件夹test,里面目录结构如下: build:放置c...

foreverzwl 3052

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C语言实现http post请求和get请求,post请求上传图片和文件

参考文章:C语言实现http post请求和get请求,post请求可以上传图片和文件

justlpf的专栏 1693

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C/C++使用libcurl库实现post图片的两种方式

一.直接上传文件方式将图片文件跟在参数的后面,这里的curl和参数需要根据自己的需要修改 char *url=" "; CURL *pCurl = NULL; CURLcode res; struct curl_slist *headerlist = NULL;struct curl...

博客 8413

C++传数据给Qml

的话,QVariant里可以放任何你想要的数据结构,一般都是自定义的居多。如果不是自定义的数据,可以直接使用QT的定义类型。那么在QML中,QMAP被当做了一个JavaScript的字典对待。这个信号,并传入自定义的数据结构。如果想给QML传入键值对,可以使用QMap类型,依然的可以使用。以上两种类型,都可以传QList,比如。C++通过发送信号,附带参数给QML。C++类通过返回类型给QML。QVariantList是。上述是qml的槽函数,连接了。,给它传入自定义的数据结构。..............

上官宏竹的专栏 3056

QML 与 C++之间的数据传输

话不多说,先上代码: //main.cpp #include <QGuiApplication> #include <qqmlapplicationengine> #include <qtqml> #include <QTextCodec> #include <QQmlContext> #include <QQuickView...

_ 6511

[QT] c++提供图片路径给qml的注意事项

在C++中引用qml时,有时需要将qml封装在qrc中,那么在c++提供qml图片源时,需要在路径前面加上file前缀,否则图片将无法找到。 解决方法如下: 例如: 图片由第三方进程提供至/var目录下,那么此图片的全路径为:/var/test.png。 那么在c++中提供给上层时,将变为: pControl-&gt;m_Pic = QString("file://") + QString::fr...

学而时习之的博客 534

QML访问本地或C++处理过的图片

在QML中,访问路径跟C++有所不同。其默认访问的是资源文件。如果要访问本地路径则需要加上“file:///”,如想访问D盘的某张图片可以这样"file:///D:/图片.jpg"。 如果想要将C++中的图片传递给QML则要借助库中的QQuickImageProvider,帮助文档有很详细的介绍。之后,QML就可以使用"image://(provider名称)/(图片id)"的格式来访问C++中...

toTheUnknown的博客 1011
上一篇: 开心一天,不开心也是一天!
下一篇: QML自动循环轮播图
Samson_Shu
博客等级 码龄11年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值