Изменения в Qt Positioning
Qt 6 — результат осознанных усилий по повышению эффективности и удобства использования фреймворка.
Мы стараемся поддерживать бинарную и исходную совместимость для всех публичных API в каждом релизе. Но некоторые изменения были неизбежны в стремлении сделать Qt лучшим фреймворком.
В этой теме мы обобщаем эти изменения в Qt Positioning и предоставляем рекомендации по их обработке.
Изменения публичного API, нарушающие совместимость
Этот раздел содержит информацию об изменениях API, которые нарушают исходную совместимость.
Переименование QGeoPolygon::path()
Методы QGeoPolygon::path() и QGeoPolygon::setPath() переименованы соответственно в QGeoPolygon::perimeter() и QGeoPolygon::setPerimeter(). В QML-стороне свойство QGeoPolygon::perimeter можно использовать без изменений.
Использование QGeoShape для области QGeoLocation
Класс QGeoLocation и его QML-аналог Location обновлены для использования QGeoShape вместо QGeoRectangle для области.
C++
Методы QGeoLocation::boundingBox() и QGeoLocation::setBoundingBox() заменены на QGeoLocation::boundingShape() и QGeoLocation::setBoundingShape() соответственно. В качестве базового хранилища данных теперь используется объект QGeoShape.
QML
Свойство QGeoLocation::boundingBox заменено на QGeoLocation::boundingShape. Это свойство доступно начиная с QtPositioning 6.2, поэтому убедитесь, что обновили версию импорта в QML-файлах.
import QtPositioning 6.2
Удаление QGeoShape::extendShape()
Метод QGeoShape::extendShape() был устаревшим в Qt 5.9 и окончательно удален в Qt 6. Используйте QGeoRectangle::extendRectangle() и QGeoCircle::extendCircle(), если вам нужна эта функциональность для этих классов.
Переименование сигнала error в errorOccurred
В Qt 5 несколько классов Qt Positioning имели сигнал error(), который конфликтовал с методом error(). В Qt 6 эти сигналы были переименованы в errorOccurred(). В частности:
-
QGeoAreaMonitorSource::error()переименован в QGeoAreaMonitorSource::errorOccurred(). -
QGeoPositionInfoSource::error()переименован в QGeoPositionInfoSource::errorOccurred(). -
QGeoSatelliteInfoSource::error()переименован в QGeoSatelliteInfoSource::errorOccurred().
Удаление сигналов таймаута обновления
В Qt 5 сигналы QGeoPositionInfoSource::updateTimeout() и QGeoSatelliteInfoSource::requestTimeout() использовались для уведомления о случаях, когда текущее положение или информация о спутниках не могли быть получены в течение указанного таймаута. Эти сигналы были удалены в Qt 6. Вместо этого используются сигналы errorOccurred() с новыми типами ошибок. В частности:
- QGeoPositionInfoSource использует сигнал errorOccurred() с новым кодом ошибки QGeoPositionInfoSource::UpdateTimeoutError.
- QGeoSatelliteInfoSource использует сигнал errorOccurred() с новым кодом ошибки QGeoSatelliteInfoSource::UpdateTimeoutError.
Те же изменения применяются к QML-объекту PositionSource. Сигнал PositionSource::updateTimeout() удален. Вместо этого используется свойство PositionSource::sourceError с типом PositionSource.UpdateTimeoutError.
Редизайн поддержки NMEA
В Qt 5 у нас был плагин позиционирования serialnmea и свойство nmeaSource в объекте PositionSource.
Плагин предоставлял доступ к потокам NMEA через последовательный порт, а QML-объект отвечал за чтение потока NMEA из TCP-соккета или локального файла.
В Qt 6 все эти функции объединены в плагине, который теперь переименован в nmea. Теперь он может работать со всеми тремя источниками данных NMEA: последовательный порт, TCP-соккет и локальный файл. Более подробную информацию см. в описании плагина.
Свойство nmeaSource объекта PositionSource теперь удалено.
Другие изменения API
Этот раздел содержит улучшения API, которые не нарушают исходную совместимость. Однако они могут повлиять на логику приложения, поэтому знать об них все равно полезно.
Правильное сброс ошибок
В Qt 5 ошибки для классов QGeoAreaMonitorSource, QGeoPositionInfoSource и QGeoSatelliteInfoSource никогда не сбрасывались. Это поведение нелогично, так как вызов startUpdates(), startMonitoring() или requestUpdates() для одного из этих классов или их подклассов фактически означает запуск новой сессии работы, что означает, что нам не следует беспокоиться о предыдущих ошибках. В Qt 6 мы сбрасываем ошибку до NoError после вызова одного из указанных выше методов.
Добавление QGeoAddress::streetNumber
Класс QGeoAddress дополнен свойством streetNumber, которое содержит информацию о номере дома, названии здания или любой другой информации, которая может использоваться для различения одного адреса от другого. Для доступа к этому свойству из кода C++ используйте streetNumber() и setStreetNumber().
Свойство QGeoAddress::street теперь содержит только название улицы.
То же самое относится к QML-аналогу Address. Свойство Address::street теперь используется только для названия улицы, а свойство Address::streetNumber — для других важных деталей адреса.
Добавление аргумента таймаута в PositionSource::update()
timeout указывается в миллисекундах. Если timeout равно нулю (значение по умолчанию), оно по умолчанию устанавливается на разумный период таймаута, соответствующий источнику.
Рефакторинг классов QGeoSatelliteInfo, QGeoPositionInfo и QGeoAreaMonitorInfo
Эти классы теперь используют QExplicitlySharedDataPointer в своей реализации. Это означает, что классы реализуют копирование при записи. Это делает их дешевыми для копирования, чтобы их можно было передавать по значению.
Другим улучшением является добавление поддержки эффективных операций перемещения.
Изменения в реализации плагина Qt Positioning
Этот раздел содержит информацию об изменениях в интерфейсе плагина.
В Qt 5 у нас были две версии интерфейса плагина:
-
QGeoPositionInfoSourceFactoryпредоставляла базовые функции. -
QGeoPositionInfoSourceFactoryV2расширяла базовый класс, позволяя передавать пользовательские параметры для созданных объектов.
В Qt 6 эти две реализации объединены в одну, оставив только класс QGeoPositionInfoSourceFactory. Его методы теперь позволяют передавать пользовательские параметры.
Примечание: интерфейс идентификатор обновлен для отражения обновления основной версии. Используйте "org.qt-project.qt.position.sourcefactory/6.0" в ваших плагинах Qt Positioning.
Вот пример объявления класса плагина:
class MyPlugin : public QObject, public QGeoPositionInfoSourceFactory
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0"
FILE "plugin.json")
Q_INTERFACES(QGeoPositionInfoSourceFactory)
public:
QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) override;
QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override;
QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override;
};
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtpositioning-changes-qt6.html