Расположение Обмен на клиенте QT
Как его использовать?
Традиционное использование
В разговоре пользователь может нажать на иконку местоположения, чтобы отобразить карту. Если на устройстве включено Локационные службы
, на карте будет показано местоположение пользователя, а также местоположение всех других членов, которые делятся своим местоположением (из всех разговоров выбранной учетной записи).
Когда пользователь делится своим местоположением в разговоре, на иконе разговора появляется красная икона местоположения. Если пользователь получает местоположение от другого члена, на всех разговорах, в которых присутствует член, будет отображаться оранжевая икона местоположения.
Пользователь может взаимодействовать с картой, занося вблизи и выходя, перемещая ее и закрывая ее. Карта также может быть закреплена или откреплена. Когда карта откреплена, она может быть переделена, если пользователь находится в правильной учетной записи. Эта функция позволяет пользователю держать карту видимой, продолжая использовать Jami.
Усовершенствованное использование
Многопользование
сценарий
Пользователь уже делится местоположением с разговором А и разговором Б.
Особенность
Если пользователь переходит на разговор C, карта все еще видима и пользователь имеет два варианта
Нажмите на кнопку «Объединение местоположения», чтобы также поделиться местоположением с участниками разговора C.
Нажмите на кнопку «Окончательное использование места». Это приведет к появлению всплывающего окна, которое позволит пользователю либо полностью отключить использование места, либо просто прекратить использование места для обмена с участниками разговора C.
Окно с запчастием
Если окно не закреплено, пользователь не сможет нажать на кнопку обмена местоположением, потому что окно больше не подключено к разговору. Чтобы начать обмен местоположением с новыми людьми, пользователь должен перезагрузить окно. Обратите внимание, что отключение окна не влияет на любое текущее обмен местоположением.
Многосчетные счета
Каждый счет имеет свою собственную уникальную карту. Если пользователь отписывает карту, пока находится на счете A, затем переходит на счет B и отписывает карту, будут видены две карты. Карты для счетов A и B отображают позиции, разделенные с этими счетами соответственно, и полностью отделены друг от друга
Как это работает?
Введение
Эта особенность разделена на три части:
Посылаю свое местоположение
Получение должности
Показание позиции
Для определения местоположения используется API [Qt Positioning]https://doc.qt.io/qt-6/qtpositioning-index.html). После определения положения он отправляется в качестве сообщения на DHT и передается клиенту. Полученное положение затем отображается с использованием библиотеки JavaScript [OpenLayers]https://openlayers.org/).
Подача позиции
Как только карта открыта, класс Позиционирование
позаботится о получении текущей позиции с использованием класса QGeoPositionInfoSource
модуля QtPositioning
. После этого позиция преобразуется в формат JSON и передается в positionManager
. Этот класс координирует весь процесс обмена позициями.
Локально через сигнал
localPositionReceived
, чтобы пользователь мог видеть свое собственное положениеНа DHT на все разговоры в
positionShareConvIds_
списке. Этот список содержит ключи всех разговоров, с которыми пользователь хочет поделиться своей позицией.
Формат JSON позиции следующий:
Тип (позиция или остановка сообщения)
Ширина
Длина
Время (не используемое Клиентом)
Пример данных: {\"лат\":45.51616583988481,\"долго\":-73.620693,\"время\":1671658862000,\"тип\":\"Позиция\"}
При отправке позиции демону также передается УРИ автора.
Когда пользователь перестает делиться своей позицией с разговором, идентификатор разговора просто удаляется из списка positionShareConvIds_
.
Получение должности
При получении позиции, она запускает слот «onPositionReceived() » (неважно, является ли это локальной позицией из модуля QtPositioning
или позицией из другого контакта. На уровне positionManager
, список objectListSharingUris_
хранит все позиции клиента.
Добавлено (УРИ не присутствует в списке)
Обновленный (УРИ уже присутствует в списке)
Удалённый (тип = «Стоп»)
Позиция хранится в списке в виде объекта типа positionObject
. Этот тип позволяет создать сторожевую собаку для каждой позиции.
Показание позиции
Когда позиция получается (слот onPositionReceived()
активируется), позиция передается Qml, который в свою очередь отправляет информацию в библиотеку JavaScript [https://openlayers.org/). Модуль Qt WebEngine
позволяет создать мост между веб-технологией библиотеки и Qml. Каждая позиция представлена слоем, добавленным к карте. Функция newPosition()
добавляет новый слой, функция updatePosition()
обновляет координаты слоя, а функция removePosition()
удаляет слой.