You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt6中XmlListModel带索引的查询失效问题求助

Qt6 XmlListModel 索引查询失效原因及修复方案

问题原因

Qt6 对 XmlListModel 的 XPath 查询上下文处理逻辑做了两处关键调整:

  • 上下文绑定逻辑变更:Qt5 允许在子 XmlListModel 的 query 字符串中直接拼接父级 rowIndex 变量构造索引查询,但 Qt6 中这种字符串拼接方式无法将变量值正确注入 XPath 解析上下文,导致索引表达式未被计算,查询直接失效。
  • XPath 解析严格性提升:Qt6 对 XPath 语法的校验更严格,原有的拼接式 XPath 格式无法被正确识别,进而返回空结果。当你改用不带索引的 "/Keyboard/Row/Key" 时,查询会遍历所有 Row 下的 Key,自然导致每行显示全部按键。

修复方案

放弃全局 XPath 加索引的写法,改用基于父模型当前节点的局部查询,这种方式更可靠且适配 Qt6:

步骤1:父模型加载所有 Row 节点

XmlListModel {
    id: rowModel
    source: "keyboard.xml"
    query: "/Keyboard/Row"
    XmlListModelRole { name: "rowNode"; elementName: "." } // 保存当前Row节点本身
}

步骤2:子模型基于父节点查询 Key

ListView {
    model: rowModel
    delegate: XmlListModel {
        id: keyModel
        source: rowNode // 直接使用父模型的Row节点作为数据源
        query: "./Key" // 局部查询当前Row下的所有Key
        XmlListModelRole { name: "keyValue"; elementName: "Value" }
        // 按需定义其他角色
    }
    // 按键布局的Delegate实现...
}

这种写法无需依赖索引拼接,直接基于当前 Row 节点做局部查询,既避开了 Qt6 的上下文绑定问题,也让代码逻辑更清晰。

补充验证(可选索引写法)

如果坚持使用索引查询,可尝试通过明确绑定确保变量被正确解析,但这种方式稳定性不如节点局部查询:

query: "/Keyboard/Row[position() = " + (model.rowIndex + 1) + "]/Key"

内容的提问来源于stack exchange,提问作者Denis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 13:35:00