【问题标题】:Qt - Configuring interface through xmlQt - 通过 xml 配置界面
【发布时间】:2017-03-20 10:05:04
【问题描述】:

我有一个本地 xml 文件告诉我:

  • 我的界面必须有多少个“滑动”页面
  • 对于任何页面,有多少行
  • 对于任何一行,有多少列 (任何列都将包含一个标签和一个值,这取决于您在节点之间找到的属性)

这是一个模板:

 <?xml version="1.0" encoding="utf-8"?>
 <parameters version="2.0">
      <page pageNum = "2">
           <row colNum = "1">
                <column>
                     <id>00001</id>
                     <name>parameterName</name>
                     <type>parameterType</type>
                     <value>parameterValue</value>
                     <min>0</min>
                     <max>100</max>
                     <step>1</step>
                </column>
           </row>
           <row colNum = "2">
                <column>
                     <id>00002</id>
                     <name>parameterName</name>
                     <type>parameterType</type>
                     <value>parameterValue</value>
                     <min>0</min>
                     <max>100</max>
                     <step>1</step>
                </column>
                <column>
                     <id>00003</id>
                     <name>parameterName</name>
                     <type>parameterType</type>
                     <value>parameterValue</value>
                     <min>0</min>
                     <max>100</max>
                     <step>1</step>
                </column>
           </row>
      </page>
      <page>
           <!-- ... etc ... -->
      </page>
 </parameters>

经过一些研究,我在一些论坛中发现 XmlListModel 不适合。 考虑到我在 Qt 中工作,我该怎么做?

在这里https://lists.launchpad.net/ubuntu-phone/msg12284.html 我发现了一些有趣的东西,但是对于读取 xml 文件使用的是 XMLHttpRequest,我不能使用它,因为我的 xml 文件只是本地的!

有人可以帮我吗?

非常感谢!

【问题讨论】:

  • 但真正的问题是什么?你想完成什么?
  • 真正的问题是如何通过这个xml文件配置我的基于qml的接口! Qml 有 XmlListModel,但它不能用于像这样复杂的事情......
  • 把xml转成qml而不是直接创建qml有什么意义?为什么XmlListModel 不适合呢?
  • 我的任务不是转换!它正在根据本地 xml 文件配置我的视图!
  • 通常你用一种叫做 QML 的特殊 JSON 方言来做这件事。使用这种方言特别有用,因为它可以由 JIT 直接解析,而不必依赖首先从 XML 转换为这种 JSON 方言的工具才能最终使用它。

标签: javascript c++ xml qml qt5


【解决方案1】:

虽然这几乎可以肯定可以使用 XmlListModel 完成(请参阅问题的评论),但这将是相当浪费的,因为模型的每个实例都需要进行所有解析和查询。

一个XmlListModel 将提供有多少页面的输入

XmlListModel {
    query: "/parameters/page"
}

然后每个页面都会有一个模型来提取该页面的行(查询未测试)

XmlListModel {
    // pageNum is a property set on each page, e.g. via the model.index of the Repeater generating the pages
    query: "/parameters/page[@pageNum=" + pageNum + "]/row"

    XmlRole { name: "id"; query: "column/id/string()" }
    // ... and so on
}

但是,我认为最好的方法是创建一个自定义的QAbstractListModel 子类,它可以表示单个页面的行。

然后可以将具有该类型列表属性的对象用作页面的模型,每个页面都使用其“行模型”。

解析只进行一次,例如使用QXmlStreamReader 构建“行模型”列表并获取每个模型的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多