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

2023-11-01

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.csdn.net/download/samson_shu/9775836

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用 Qt 的网络服务

    我正在寻找使用 Qt 服务器端 实现 Web 服务的代码 如果您有任何信息 我将不胜感激 Regards 您可以使用libqxt http libqxt bitbucket org doc 0 6 qxtweb html实现服务器端Web服
  • Qt:删除富文本

    对于明文有QFontMetrics elideText https doc qt io qt 5 qfontmetrics html elidedText https doc qt io qt 5 qfontmetrics html eli
  • wkhtmltopdf 修补了 qt 吗?

    我正在尝试将多个 URL 转换为 PDF 但是 当我编译 wkhtmltopdf 或运行时apt get install wkhtmltopdf并尝试一下 它说 错误 此版本的 wkhtmltopdf 是针对未修补的 QT 版本构建的 并且
  • QObject多重继承

    我正在尝试在 C Qt 类中使用 mix 来提供一大堆具有通用接口的小部件 该接口是以这样的方式定义的 如果它被定义为其他小部件类的基类 那么小部件本身将具有这些信号 class SignalInterface public QObject
  • Qt 创建者 4.8.4。 Windows 7 - 64 位安装

    我在 QT 方面遇到了一些困难 我需要在学校使用它来完成一些 GUI 应用程序 我最近完成了以下步骤 1 mingw get inst 20120426 exefrom 来源锻造 http sourceforge net projects
  • 如何将flex和bison与Qt项目集成?

    我正在 git 源代码控制下使用 Qt4 制作 GUI 程序 Github页面 https github com vinayak garg dic sim 项目的一小部分需要扫描和解析 所以我想在项目中使用flex和bison 我能想到3种
  • QMessageBox::about 可以根据标题长度调整大小吗?

    我想创建一个简单的 关于 对话框 但注意到QMessageBox about不会根据标题的长度调整其大小 由于字体较大 标题通常会更长 至少在我的桌面环境中 仅根据内容调整其大小 有没有办法确保对话框足够大以显示所有标题 我当然可以向 ab
  • cmake 找不到 Qt4

    由于4 8 0已经发布 我重新安装了Qt 现在我也想使用cmake 为了使 cmake 工作 我记得必须添加 mingw bin 文件夹 QtSDK Desktop Qt 4 7 3 到Qt4 7 3中的PATH 所以我猜测在中会有一个类似
  • MSVC C4100:“应用程序”:未引用的形式参数警告

    使用 MSVC 编译时 以下代码会生成 C4100 警告 这怎么可能 显然引用了 应用程序 class ApplicationInfo public QObject Q OBJECT public static void initializ
  • qvariant 作为 qhash 中的键

    我想创建一个带有 QVariants 键的数据结构 它看起来像这样 QHash
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • 如何从键盘为 QTableWidget 创建信号?

    我有一张桌子 可以通过左 右 上 下按钮在里面移动 现在 当我停留在某个单元格并按空格键时 我需要创建一个信号 该信号还应该带来该单元格的坐标 我尝试使用 QTableWidget 的标准信号 但它不起作用 我该如何解决这个问题 创建一个单
  • Qt - 意外的 GDB 退出

    我正在尝试开发一个应用程序 该应用程序创建图像并使用双线性插值填充颜色像素 然后显示它 到目前为止我的代码如下 include
  • QtWebEngine Quicknano 在嵌入式 Linux 中没有声音

    我已将 QtWebEngine 编译到我的 i MX6 嵌入式设备中 当我尝试使用 Quicknanobrowser 播放 YouTube 视频时 视频会播放 但没有声音 事实上 当我尝试播放音频文件时没有声音hpr dogphilosop
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • 在 Qt 中创建/写入新文件

    我正在尝试写入文件 如果该文件不存在 则创建它 我在互联网上搜索过 但没有任何效果 我的代码目前看起来像这样 QString filename Data txt QFile file filename if file open QIODev
  • Qt:关闭模式对话框关闭程序

    在我的 Qt 程序中 我有 2 个窗口 主窗口和子窗口 在程序中 一次仅显示这些窗口之一 主窗口有一个插槽 用于创建模式对话框 现在 假设子窗口中单击按钮的信号被发送到该插槽 在这种情况下 主窗口隐藏 子窗口可见 对话框显示得很好 但是当对
  • 渲染具有透明度的纹理时,OpenGL 不需要的像素

    我已经为这个问题苦苦挣扎了一段时间了 当我使用 OpenGL 渲染 2D 纹理 在无透明度和部分透明度之间的过渡上具有透明度值 时 我得到了一些烦人的灰色像素 我认为这是像素值插值的产物 关于如何改进这一点有什么想法吗 I m attach
  • Qt ObjectName() 必须是唯一的吗?

    如标题所示的简单问题 如果我打电话setObjectName 在一个对象上 它是否必须是唯一的 或者只是因为约定而推荐 我已经子类化了QLabel 并希望自动为创建的对象命名 如果这是一个坏主意 我会找到一些设置随机唯一名称的方法 我实际上

随机推荐