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
相关产品推荐
相关产品推荐

