QML 地点 API

概览

地点 API 允许用户发现兴趣地点并查看它们的详细信息,例如地址和联系信息。一些地点可能还关联有其他内容,如图片和评论。地点 API 还允许您管理和分类地点,使您能保存和删除它们。地点还可以包括路径、道路或交通方式,从而实现导航优化和辅助。有关导航的更多信息,请参阅路线

入门概念

插件

插件是一个后端的抽象。一个插件可能通过 REST 服务器访问地点,而另一个可能通过本地数据库访问地点。以下是通过提供“osm”名称来实例化一个插件对象的示例。插件名称确定要选择哪个后端。插件还可以提供一组参数,这些参数基本上是一组键值对。可以指定的参数在不同插件后端之间可能不同。有关可能的 参数 和每个 插件 的细微差别,请参阅插件参考

Plugin {
    id: myPlugin
    name: "osm"
    //specify plugin parameters as necessary
    //PluginParameter {...}
    //PluginParameter {...}
    //...
}

模型、视图和代理

QML 地点 API 围绕模型、视图和代理的概念构建。

模型模型保存数据项并保持其结构。模型还负责从数据源检索项目。
视图视图是一个可视化容器,显示数据并管理如何显示可视化项,例如列表或网格中的可视化项。视图还可能负责导航数据,例如在翻页动作期间滚动可视化项。
代理代理定义了单个数据元素如何在视图中作为可视化项出现。模型公开一组数据角色,代理使用它们来构建可视化项。代理还可以定义行为,如当可视化项被点击时调用的操作。

下面的常用用例部分演示了这些概念如何结合在一起的具体示例。

常用用例

搜索地点

搜索通过PlaceSearchModel完成。属性plugin指定了搜索操作的后端。搜索参数可以通过如searchTermsearchArea这样的属性提供。然后可以通过调用方法update()启动搜索操作。为了简单起见,以下代码片段在完成模型构造后调用了一次update(通常是在用户点击按钮等操作后触发)。在搜索操作进行时,PlaceSearchModel::status属性变为“加载”状态,成功完成后变为“就绪”状态。

PlaceSearchModel {
    id: searchModel

    plugin: myPlugin

    searchTerm: "food"
    searchArea: QtPositioning.circle(startCoordinate, 5000 /* 5 km radius */);

    Component.onCompleted: update()

}

使用ListView显示搜索结果

可以使用ListView来显示模型找到的搜索结果。它定义了结果显示的视觉区域,在以下情况下,它充满了其父容器的全部空间。《ListView》具有内置行为,可以让区域对滑动事件做出响应,并适当进行滚动。

以下代码片段中,将搜索模型分配给ListViewmodel属性。当模型更新并添加新的结果时,ListView会自动更新以反映模型的新数据项。

一个简单的代表绑定到了ListViewdelegate属性。《PlaceSearchModel》公开了一系列roles,其中下面的titleplace角色已被使用,它们分别是字符串型和Place型。从本质上讲,对于每个应在视图中可见的数据项,视图会调用代表来创建该项的视觉表示。

ListView {
    anchors.fill: parent
    model: searchModel
    delegate: Component {
        Row {
            spacing: 5
            Marker { height: parent.height }
            Column {
                Text { text: title; font.bold: true }
                Text { text: place.location.address.text }
            }
        }
    }
}

注意:为了简单起见,我们假设每个搜索结果都是类型为typePlaceSearchResult,因此始终可以访问place角色,其他搜索结果类型可能不具有place角色。

查看位置列表示例以获取完整的源代码。

使用MapItemView显示搜索结果

除了ListView之外,PlaceSearchModel可以与MapItemView一起使用,在地图上显示标记。首先使用Map定义地图占据的视觉区域,在本例中,它充满了其父容器的全部空间。其他属性也被指定,如提供地图的plugin以及地图的centerzoomLevel

Map内部,声明了一个MapItemView,其中model属性被设置为搜索模型,一个由MapQuickItem组成的delegate用于显示标记图像。对于搜索模型发现的每个地点,都会显示一个标记。代表使用place角色来定位标记。

MapView {
    id: view
    anchors.fill: parent
    map.plugin: myPlugin;
    map.center: positionSource.lastSearchPosition
    map.zoomLevel: 13

    MapItemView {
        model: searchModel
        parent: view.map
        delegate: MapQuickItem {
            coordinate: place.location.coordinate

            anchorPoint.x: image.width * 0.5
            anchorPoint.y: image.height

            sourceItem: Column {
                Image { id: image; source: "marker.png" }
                Text { text: title; font.bold: true }
            }
        }
    }
}

注意:为了简单起见,我们假设每个搜索结果都是类型为typePlaceSearchResult,因此始终可以访问place角色,其他搜索结果类型可能不具有place角色。

查看位置地图示例以获取完整的源代码。

获取地点详情

为了节省带宽,有时后端只返回部分填充了详情的地点。这可以通过检查 Place::detailsFetched 属性来实现,该属性指示是否已获取所有可用的详情。如果没有,可以通过调用 Place::getDetails() 方法来获取剩余的详情。

if (!place.detailsFetched)
    place.getDetails();

保存和删除地点

某些后端可能支持保存和删除地点。可以通过分别调用 Place::save() 和 Place::remove() 方法来实现。请注意,为了保存 Place,必须分配一个 Plugin 来指定我们要保存到的后端。在保存操作发生时,status 属性将过渡到 Saving 状态,并成功完成后将移动到 Ready 状态。以下代码片段展示了如何使用javascript保存和删除地点。

//creating and saving a place
var place = Qt.createQmlObject('import QtLocation; Place { }', parent);
place.plugin = myPlugin;
place.name = "New York";
place.location.coordinate.latitude = 40.7
place.location.coordinate.longitude = -74.0
place.save();

//removing a place
place.remove();

了解更多

上述代码片段仅展示了地点功能的一小部分。请参见下方的地点类型,以获取更丰富的内容,例如图像评论等,以及更深入的描述和解释。

还可以参见地点(QML)示例,以了解如何更全面地使用API。

地点类型

数据类型

类别

类型表示地点可以与之关联的类别

联系详情

类型包含地点的联系方式详情

扩展属性

类型包含有关地点的额外数据

地点

类型表示一个位置,即一个感兴趣的位置

联系详情

类型包含如电话号码或网站地址之类的联系详情

图标

类型代表地点的图标

地点属性

类型包含通用地点属性信息

评分

类型包含地点评分信息

供应商

包含有关地点供应商、地点图像、评论或编辑的数据

用户

类型标识向特定地点内容项做出贡献的用户

模型

类别模型

类型提供了一个由插件支持的类别模型

编辑模型

类型提供了一个地点编辑的模型

图像模型

类型提供了一个地点图像的模型

地点搜索模型

提供对地点搜索结果访问的权限

地点搜索建议模型

提供访问搜索词建议的权限

评论模型

类型提供了一个地点评论的模型

© 2024 Qt公司有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款获得许可。Qt及其 respective标志是芬兰及其它国家和地区的Qt公司有限公司的商标。所有其他商标均为其所有者的财产。