当前位置: 首页 > 知识库问答 >
问题:

有没有办法在qml中键入从json解析的对象

卜和悌
2023-03-14

json文档如下所示。我想在qml中为它定义一个类,就像typescript中的接口关键字一样。

{
    "ScannerID": "ID",
    "Status": 1,
    "SuccessRate": 0.999,
    "Result": [{
            "Codes": "result_11111",
            "Positions": {
                "CenterX": 10.0,
                "CenterY": 10.0,
                "Width": 100.0,
                "Height": 100.0,
                "Angle": 50
            },
            "Types": "QrCode"
        },
        //more items
    ]
}

我试图定义一个qml类在文件ScannerResult.qml

import QtQuick 2.4

QtObject {
    property string pScannerID
    property int pStatus
    property real pSuccessRate
    // how to define Result with strong type?
    property ? pResult

    function load(obj) {
        pScannerID = obj.ScannerID
        //......
    }
}

那就用吧

...
ScannerResult {
    id: scannerResult
}

function log(jsonstr) {
    let obj = JSON.parse(jsonstr);
    scannerResult.load(obj)
    console.log(scannerResult.pScannerID) // it works
}
...

但是在“Result”键下很难处理对象的向量。因为qml不允许在类A下定义类B。
那么有人知道如何定义强类型类来保存qml中从json解析的对象吗?然后我可以在qtcreator中使用自动完成的类。

共有1个答案

贺轶
2023-03-14

您可以创建一个属性var并将其分配为一个列表/数组/向量来保存pResult。要填充此列表,您可以创建一个“B类”组件,并在解析JSON对象时动态创建此类的实例。

使用您的代码结构,这里是ScannerResult的更新版本。qml

import QtQuick 2.4

QtObject {
    property string pScannerID
    property int pStatus
    property real pSuccessRate
    property var pResult: []

    function load(obj) {
        pScannerID = obj.ScannerID
        //... etc
        for (var element of obj.Result) {
            let resultQtObject = resultComponent.createObject(this, {})
            resultQtObject.pCodes = element.Codes
            resultQtObject.pTypes = element.Types
            resultQtObject.pPositions.pCenterX = element.Positions.CenterX
            //... etc
            pResult.push(resultQtObject)
        }
    }

    property Component resultComponent: Component {

        QtObject {
            property string pCodes
            property string pTypes
            property QtObject pPositions: QtObject {
                property real pCenterX
                property real pCenterY
                property real pWidth
                property real pHeight
                property int pAngle
            }
        }
    }
}

更新后的log功能的工作原理如下:

    function log(jsonstr) {
        let obj = JSON.parse(jsonstr);
        scannerResult.load(obj)
        console.log(scannerResult.pScannerID) // it works
        console.log(scannerResult.pResult[0].pPositions.pCenterX) // it works
    }

由于您正在运行时动态创建此组件的实例,QtCreator无法为其提供自动完成建议。正如您提到的向量长度未知,我相信运行时实例化是您唯一的选择,因此没有能够适应自动完成的解决方案。

另一件需要注意的事情是,如果多次运行log()/load(),则需要清理pResult列表和destroy()动态创建的对象。

 类似资料:
  • 我有以下疑问: 包含

  • 问题内容: 上面的问题是参考上面线程中描述的内容。有这么多的API,可以灵活地返回XML或JSON响应。我想知道是否有一种方法可以自动构造与JSON响应相对应的java bean。 问题答案: 假设您得到一个类似 你想要一个像 使用getter和setters的一种方法是使用JSONGen之类的服务,它将创建该类。您需要使用它 第一 ,并在项目中包含生成的代码。另一种选择可能是动态生成使用了Jav

  • 我有如下代码- 在这里,当app.run(host='127.0.0.1 ',port='80 ')运行时,会给出URL - http://127.0.0.1/getcode。我需要手动打开输入用户名和密码,然后又一个窗口来输入YOB,然后给我这样的东西- 我的问题是,有没有一种方法可以避免手动打开浏览器,输入凭证并获取代码。我们可以用python来解析整个事情吗?

  • 问题内容: 我今天才刚刚开始学习GoLang,我正在尝试构建一个简单的Rest API Web服务器。 这是我希望将每个请求发送到Web服务器的响应结构: 这是我的 articles.go 文件,该文件具有获取数据库中所有文章的功能: 我在这里面临的问题是响应是这样的: {“状态”:200,“描述”:“”,“正文”:“ [{\” id \“:\” 1 \“,\”标题\“:\”第一\“,\”正文\“

  • 本文向大家介绍ubuntu下没有中文输入法的解决办法,包括了ubuntu下没有中文输入法的解决办法的使用技巧和注意事项,需要的朋友参考一下 ubuntu下没有中文输入法的解决办法! 我们在安装虚拟机或者ubuntu系统的时候,常见的是尽管是中文版本的但却没有中文输入法,确实是一件很恼火的事情! 我自己也亲身经历过,特此给大家提供一种方法,很好用的! 我们在安装ubuntu系统的时候,最常见也是我们

  • 我可以在写入之前读取表,并在写入新行之前删除匹配行。 阅读后,我可以筛选应用程序中的行。 我不喜欢这两个解决方案,因为它们似乎太复杂了,性能是一个很大的问题。有更好的办法吗?