修改Map组件宽高时如何更新或重载MapQuickItem的显示位置
问题原因
这是Qt Location模块的已知实现问题:Map组件宽度变化时会主动触发所有地图项的视口坐标重算逻辑,但高度变更时未触发对应的更新通知,导致经纬度固定的MapQuickItem不会自动同步计算新的屏幕位置,因此出现偏移或消失。
解决方案
监听Map的高度变化事件,手动触发所有marker的位置重算即可,最常用的实现方式是在高度变更时给marker的coordinate重新赋值一次(即使值未变化,也会触发属性变更信号,驱动位置重绘)。
修改后示例代码
Map { id: map height: 100 // 修改此处高度值时也会触发marker位置更新 width: 100 MapItemView { id: mapItemView // 新增id,方便遍历子项 model: xxxx delegate: MapQuickItem { id: marker anchorPoint.x: image.width/4 anchorPoint.y: image.height coordinate: object.coordinate sourceItem: Image { id: image source: "xxxx.png" } } } // 新增高度变化监听逻辑 onHeightChanged: { // 遍历所有当前存在的delegate触发位置更新 for (let i = 0; i < mapItemView.count; i++) { const marker = mapItemView.itemAtIndex(i) // 重新赋值coordinate触发重绘 marker.coordinate = marker.coordinate } } }
替代方案(适用于小数据量场景)
如果你的model数据量很小,也可以通过临时重置model触发全量更新:
onHeightChanged: { const tempModel = mapItemView.model mapItemView.model = null mapItemView.model = tempModel }
内容的提问来源于stack exchange,提问作者Mr.Tu
相关产品推荐
相关产品推荐

