在qml地图的位移/缩放稳定后启动filterAcceptsRow

时间:2018-01-04 10:24:45

标签: qt location qml

在QML地图上,使用" onCenterChanged"为了捕获用户激活的移动,一旦移动开始,要显示的点的过滤过程就开始。

鉴于在此操作期间要处理的数据量很大,我希望它仅在Map完全稳定后停止(停止滑动/缩放,释放鼠标左键并且鼠标滚轮无效)。

这是QML地图的片段

Map {
    id: mainMap
    anchors.centerIn: parent;
    anchors.fill: parent
    plugin: Plugin {name: "osm"}
    center: startingPoint
    zoomLevel: 4.5

    onCenterChanged: {
        updateBoundingBox()
    }

    MapItemView {
        id:viewPointOnMap
        model: navaidsFilter
        delegate: Marker{}
    }

    onMapReadyChanged: {
        updateBoundingBox()
    }

    function updateBoundingBox(){
        navaidsFilter.bBox = mainMap.visibleRegion.boundingGeoRectangle() //boundingBox
    }

}//Map

和过滤器片段:

void NavaidsFilter::setBBox(const QGeoRectangle &bbox)
{
    if(m_processedZone.isEmpty()|| !m_processedZone.contains(bbox)){  //First bbox or displacement/zoom out of the previous box
        m_processedZone = bbox;
        m_boundaryZone = bbox;
        invalidateFilter();
    }
}

bool NavaidsFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
    if(!m_boundaryZone.isValid()){
        return false;
    }

    QModelIndex ix = sourceModel()->index(sourceRow, 0, sourceParent);
    QGeoCoordinate pos = ix.data(NavaidsModel::PositionRole).value<QGeoCoordinate>();
    return m_boundaryZone.contains(pos);
}

我们如何实现这一目标?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我从未与Map合作过,因此我不知道具体的解决方案。以下是两种在许多情况下都有效的通用解决方案:

  1. 引入一个聚合所有相关状态的属性

    readonly property bool moving: mainMap.gesture.rotationActive
                                   | mainMap.gesture.tiltingActive
                                   | ...`
    

    一旦此属性更改为false,请执行必要的操作。 (onMovingChanged

    1. 每当发生变化时,请使用重新启动的Timer。如果某些 ms 没有任何变化,请让它触发并执行必要的操作。