QML Repeater委托内动态设置Settings属性别名实现单分类配置存储
解决方案
你不需要动态生成property alias,QML的Settings组件本身提供了动态读写指定键值的API,调整思路如下:
- 将
Settings组件从Repeater的delegate中抽离到外层,全局共用一个实例,固定category为你需要的category,避免生成多分类 - 利用
Settings的value()方法在SpinBox初始化时读取对应键的配置 - 监听SpinBox的
valueChanged信号,值变化时调用setValue()方法写入对应键的配置,键名直接用modelData即可
调整后的完整代码
Column { Settings { id: globalConfig fileName: "config" category: "category" } Repeater { model: ["item1", "item2", "item3", "item4", "item5"] delegate: RowLayout { Label { text: modelData } SpinBox { id: box // 初始化读取配置,第二个参数为默认值,可自行修改 Component.onCompleted: value = globalConfig.value(modelData, 0) // 值变更时写入配置 onValueChanged: globalConfig.setValue(modelData, value) } } } }
原理说明
QML的property alias属于编译期静态声明的属性,无法在运行时根据动态数据(如modelData)生成,因此动态创建alias的思路本身不可行,用官方提供的动态读写API是最简洁的实现方式,最终生成的配置文件完全符合你需要的单分类结构:
[category] item1=0 item2=0 item3=0 ...
内容的提问来源于stack exchange,提问作者vld17
相关产品推荐
相关产品推荐

