在QT客户端共享位置

如何使用它?

轻微使用

在对话中,用户可以点击位置图标来显示地图.如果设备上启用了 Location Services,则将显示用户的位置在地图上,以及所有其他分享位置的成员的位置 (从选择帐户的所有对话中).用户可以通过点击位置共享按切换位置共享.默认情况下,用户的位置共享为15分钟,但该设置可以在应用程序设置中修改.

当用户在对话中分享自己的位置时,会在对话标志上出现红色位置图标.如果用户从另一个成员那里获得位置,会在所有成员参与的对话中显示一个色位置图标.

通过近期调整,放大进出,移动和关闭地图,用户可以与地图互动.地图也可以被结或不结.如果地图被结,如果用户在正确的帐户中,则可以重新结.

高级使用

多分类

情况

用户已经与对话A和对话B共享位置.

功能

如果用户转换到对话C,地图仍然可见,用户有两个选择

  1. 单击位置共享按,也可以与对话C成员共享位置.

  2. 按点击位置共享终端按. 这会显示一个弹出,允许用户完全关闭位置共享,或者只停止与对话C成员共享位置.

嵌窗户

如果窗口被打开,用户将无法点击位置共享按,因为窗口不再连接到对话.为了开始与新人共享位置,用户必须重新点击窗口.请注意,打开窗口不会影响任何持续的位置共享.此外,在窗口被打开时点击位置共享终端按将停止所有当前位置共享,并不会出现任何弹出,允许用户选择特定的对话,以停止共享.

多个账户

每个帐户都有自己的独特地图.如果用户在帐户A上卸载地图,然后切换到账户B,然后卸载地图,两个地图将会显现.

怎么办?

引言

这种特征分为三个部分:

  1. 发送一个位置

  2. 接收职位

  3. 显示一个位置

为了确定位置,使用[Qt定位]https://doc.qt.io/qt-6/qtpositioning-index.html) API. 一旦确定位置,它将作为DHT上的消息发送给客户端.接收的位置随后通过[OpenLayers]https://openlayers.org/) JavaScript库显示.

发送位置

QGeoPositionInfoSource类的使用,在地图开放后,将位置转换为JSON格式,并传输到 positionManager.该类协调整个位置共享过程.该位置随后通过 `sendPosition() 函数共享.

  • 通过” 地方位置Received信号,让用户可以看到自己的位置

  • 在DHT上,在ShareConvIds_`列表中所有对话.该列表包含用户想要分享自己的位置的所有对话的关键.从这个键中,获取所有参与者的URI,并发送一个位置信息给每个参与者.

位置的JSON格式如下:

  • 类型 (位置或停止消息)

  • 宽度

  • 长度

  • 时间 (QtClient未使用)

时间:1671658862000,类型: 位置:

传送位置给恶魔时,作者的URI也会传输.

当用户停止与对话分享自己的位置时,对话的ID就从ShareConvIds_`列表中删除.

接收职位

当收到位置时,它会触发”onPositionReceived() “区块.无论是来自于 QtPositioning模块的本地位置还是来自其他联系人的位置.在 positionManager级别上, objectListSharingUris_列表存储了客户的所有位置.位置是:

  • 添加 (URI不在列表中)

  • 更新 (URI已经存在列表中)

  • 删除 (类型 = “停止”)

位置存储在列表中以类型的物体形式 positionObject. 这类型允许每个位置都有监视犬.如果该位置在特定的时间内不更新,则将从列表中删除.

显示一个位置

当收到位置时 (slot onPositionReceived() 触发),该位置被传输到Qml,该位置反过来将信息发送到 [OpenLayers]https://openlayers.org/) JavaScript 库.Qt WebEngine模块允许图书馆的网络技术和Qml之间的桥梁.每个位置由一个层添加到地图中. newPosition() 函数添加一个新的层, updatePosition() 函数更新层的坐标, removePosition() 函数删除层.