如何保存OpenStreetMap地图类型ComboBox索引?Qt.labs.settings失效求助
解决Qt.labs.settings保存OSM地图类型ComboBox索引不生效的问题
当然可以实现这个需求啦!你的代码里主要是初始化顺序和异步加载的问题导致Settings没起作用,我来帮你梳理问题并给出修正方案:
问题出在哪?
Map的supportedMapTypes是依赖OSM插件异步加载的,而你的Settings在窗口启动时就试图设置selectmap.currentIndex——这时候ComboBox的model还是空的,设置索引自然无效。- 你用了属性别名绑定,但没处理ComboBox初始化时的索引恢复逻辑,也没考虑保存的索引可能超出可用类型数量的情况(比如插件更新后地图类型变了)。
修正后的完整代码
import QtQuick 2.6 import QtQuick.Controls 2.0 import QtLocation 5.12 import QtPositioning 5.12 import Qt.labs.settings 1.0 ApplicationWindow{ id: root width: 500 height: 500 visible: true // 专门存地图类型索引的设置项,默认给0确保首次启动有值 Settings{ id: mapSettings property int savedMapTypeIndex: 0 } Flickable { height: parent.height width: parent.width clip: true contentHeight: Math.max(mapColumn.implicitHeight, height) Column{ anchors.horizontalCenter: parent.horizontalCenter id:mapColumn spacing: 5 anchors.fill : parent Row{ anchors.horizontalCenter: parent.horizontalCenter spacing:25 Rectangle{ width:mapColumn.width height:mapColumn.height-80 Map { id:map anchors.fill: parent plugin: Plugin { name: "osm" } // 等地图类型列表加载完成后,再恢复保存的索引 onSupportedMapTypesChanged: { // 先校验索引合法性,防止越界 const validIndex = Math.min(mapSettings.savedMapTypeIndex, supportedMapTypes.length - 1) selectmap.currentIndex = validIndex >= 0 ? validIndex : 0 } } } } Column{ id: combos spacing: 10 width: parent.width anchors.verticalCenter: root.verticalCenter Row{ anchors.horizontalCenter: parent.horizontalCenter spacing:1 Label{ text:"Map Type: "; height: selectmap.height; verticalAlignment: Text.AlignVCenter; } ComboBox { id: selectmap width: 200 model: map.supportedMapTypes textRole:"description" // 选中变化时,更新地图类型并保存索引 onCurrentIndexChanged: { if (currentIndex >= 0 && currentIndex < map.supportedMapTypes.length) { map.activeMapType = map.supportedMapTypes[currentIndex] mapSettings.savedMapTypeIndex = currentIndex } } } } } } } }
关键修改说明
- 把原来的属性别名改成了独立的
savedMapTypeIndex,还加了默认值0,避免首次启动没有保存值的问题。 - 利用
Map的onSupportedMapTypesChanged信号,等地图类型列表加载完成后再恢复索引——这时候ComboBox的model已经存在,设置索引就会生效了。 - 加了索引合法性校验:如果保存的索引超出当前可用类型数量,自动取最后一个有效索引或者0,防止出现错误。
- 在ComboBox的选中事件里,先判断索引是否有效再更新地图和保存设置,避免无效操作。
这样修改后,重启应用就能正确恢复上次选中的地图类型啦!
内容的提问来源于stack exchange,提问作者Edip Ahmet
相关产品推荐
相关产品推荐

