Informations sur les satellites
L'exemple Informations satellite montre les satellites disponibles en vue ciel, vue tableau ou vue RSSI, ainsi que la position actuelle de l'utilisateur. Il est mis en œuvre avec Qt Positioning et Qt Quick.
Cet exemple démontre l'utilisation de Qt Positioning QML API:
L'exemple montre également comment utiliser un modèle personnalisé C++ avec un modèle proxy personnalisé de QML.
Exécution de l'exemple
Pour exécuter l'exemple de Qt Creatorouvrez le mode Welcome et sélectionnez l'exemple de Examples. Pour plus d'informations, voir Qt Creator: Tutoriel : Construire et exécuter.
Présentation de l'interface utilisateur
L'exemple montre des informations sur les satellites dans trois onglets différents. Les données proviennent des propriétés SatelliteSource::satellitesInView et SatelliteSource::satellitesInUse.

L'onglet Sky View montre les positions relatives des satellites en utilisant les propriétés Azimuth et Elevation attributes . En cliquant sur un objet satellite individuel, une fenêtre contextuelle s'ouvre avec satellite identifier, son azimut et son élévation.
L'onglet Table View affiche la liste de tous les satellites détectés et permet de trier et de filtrer la liste.

L'onglet RSSI View (Affichage RSSI ) indique la puissance du signal des satellites visibles à l'aide de la propriété signalStrength. Les nombres situés sous les barres représentent les différentes satellite identifiers.
Les onglets Sky View et RSSI View indiquent également la latitude et la longitude actuelles. Ils utilisent la propriété PositionSource::position pour extraire ces informations.
Le bloc d'état situé au-dessus des onglets indique le mode actuel ou la dernière erreur.
Le menu Paramètres vous permet de changer le mode de couleur de l'application et d'afficher les informations d'aide.
L'application fonctionne dans trois modes différents :
| Mode d'application | Description de l'application |
|---|---|
| En cours d'exécution | L'application interroge en permanence le système pour obtenir des mises à jour sur les satellites et la position. Lorsque de nouvelles données sont disponibles, elles sont affichées. |
| Arrêtée | L'application cesse de mettre à jour les informations relatives aux satellites et à la position. |
| Unique | L'application fait une seule demande de mise à jour de satellite et de position. |
L'application passe automatiquement en mode simulation si la plate-forme ne fournit pas d'informations sur le satellite ou la position. Le mode simulation utilise un plugin NMEA avec des données NMEA préenregistrées.
Remarque : Apple ne fournit pas d'API pour récupérer les informations satellite. Sur macOS et iOS, les informations satellite proviennent toujours de données préenregistrées. Ces limitations de l'API n'affectent pas les informations de positionnement, de sorte que la position actuelle peut être affichée correctement.
Récupération de la position actuelle
La position actuelle est récupérée à partir de l'objet QML PositionSource. Le gestionnaire onPositionChanged est utilisé pour recevoir les mises à jour de la position. Les représentations en chaîne de la latitude et de la longitude sont extraites de la propriété coordinate.
PositionSource { id: positionSource name: root.simulation ? "nmea" : "" onPositionChanged: { let posData = position.coordinate.toString().split(", ") positionBox.latitudeString = posData[0] positionBox.longitudeString = posData[1] } }
Récupération des informations sur le satellite
Comme pour la position, les informations actuelles sur le satellite sont extraites de l'objet QML SatelliteSource. Les gestionnaires onSatellitesInViewChanged et onSatellitesInUseChanged sont utilisés pour obtenir la mise à jour des satellites en vue et des satellites utilisés, respectivement. Dans cet exemple, les données sont ensuite transmises au modèle C++, qui est ensuite utilisé dans toutes les vues.
SatelliteSource { id: satelliteSource name: root.simulation ? "nmea" : "" onSatellitesInViewChanged: root.satellitesModel.updateSatellitesInView(satellitesInView) onSatellitesInUseChanged: root.satellitesModel.updateSatellitesInUse(satellitesInUse) }
Remarque : l'exemple montre à la fois l'API de positionnement QML et l'intégration du modèle C++ à QML. C'est la raison pour laquelle les informations satellite sont d'abord récupérées dans QML, puis transmises à C++, et enfin à QML pour être utilisées dans le modèle. En pratique, si l'application est censée utiliser des modèles C++ complexes, envisagez d'utiliser directement la classe QGeoSatelliteInfoSource de C++.
Utilisation de modèles C++ personnalisés
L'exemple utilise deux modèles personnalisés - SatelliteModel et SortFilterModel.
Modèle satellite
La classe SatelliteModel est dérivée de QAbstractListModel et réimplante les méthodes rowCount(), data() et roleNames() pour représenter les informations satellite. L'utilisation de QAbstractListModel comme classe de base permet d'utiliser facilement le modèle avec les types QML ListView et Repeater. Une propriété size personnalisée est utilisée uniquement dans l'onglet RSSI View pour calculer dynamiquement la largeur des barres d'onglets.
class SatelliteModel : public QAbstractListModel { Q_OBJECT Q_PROPERTY(int size READ rowCount NOTIFY sizeChanged) QML_ELEMENT public: explicit SatelliteModel(QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QHash<int, QByteArray> roleNames() const override; public slots: void updateSatellitesInView(const QList<QGeoSatelliteInfo> &inView); void updateSatellitesInUse(const QList<QGeoSatelliteInfo> &inUse); signals: void sizeChanged(); };
La méthode roleNames() est utilisée pour faire correspondre les rôles du modèle aux noms des propriétés qui peuvent être utilisés pour accéder aux données du modèle à partir de QML. Par exemple, le nom id est utilisé pour extraire l'identifiant du satellite, et le nom rssi est utilisé pour obtenir l'intensité du signal.
QHash<int, QByteArray> SatelliteModel::roleNames() const { return { {Roles::IdRole, "id"}, {Roles::RssiRole, "rssi"}, {Roles::AzimuthRole, "azimuth"}, {Roles::ElevationRole, "elevation"}, {Roles::SystemRole, "system"}, {Roles::SystemIdRole, "systemId"}, {Roles::InUseRole, "inUse"}, {Roles::VisibleNameRole, "name"} }; }
Du côté de QML, nous pouvons utiliser ces noms pour obtenir les valeurs réelles. Par exemple, l'implémentation de RSSI View utilise les noms de rôle rssi, inUse, et id pour dessiner les barres qui représentent les satellites individuels :
Repeater { id: repeater model: root.satellitesModel delegate: Rectangle { required property var modelData height: rect.height width: view.singleWidth color: "transparent" SemiRoundedRectangle { anchors.bottom: satId.top width: parent.width height: (parent.height - satId.height) * Math.min(parent.modelData.rssi, rect.maxVisibleLevel) / rect.maxVisibleLevel color: parent.modelData.inUse ? root.inUseColor : root.inViewColor } Text { id: satId anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.bottom text: parent.modelData.id color: Theme.textSecondaryColor font.pixelSize: Theme.smallFontSize font.weight: Theme.fontLightWeight } } }
Modèle proxy
La classe SortFilterModel est utilisée pour fournir un tri et un filtrage personnalisés des objets satellites affichés dans l'onglet Table View.
Le modèle est dérivé de QSortFilterProxyModel et réimplante les méthodes filterAcceptsRow() et lessThan() pour fournir le filtrage et le tri. Le modèle expose également plusieurs slots pour régler le comportement du filtrage et du tri.
class SortFilterModel : public QSortFilterProxyModel { Q_OBJECT QML_ELEMENT public: explicit SortFilterModel(QObject *parent = nullptr); public slots: void updateFilterString(const QString &str); void updateShowInView(bool show); void updateShowInUse(bool show); void updateSelectedSystems(int id, bool show); void updateSortRoles(int role, bool use); protected: bool filterAcceptsRow(int row, const QModelIndex &parent) const override; bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; };
Ces emplacements peuvent être appelés à la fois à partir de C++ et de QML. Par exemple, le délégué de l'identificateur de satellite utilise l'emplacement updateSelectedSystems() pour afficher ou masquer les informations sur les satellites appartenant à certains systèmes de satellites. De même, les délégués à l'état des satellites utilisent les emplacements updateShowInView() et updateShowInUse() pour filtrer les satellites ayant un état spécifique.
Repeater { model: root.satelliteSystemModel delegate: CheckElement { required property var modelData text: modelData.name Layout.alignment: Qt.AlignRight onCheckedChanged: { root.sortFilterModel.updateSelectedSystems(modelData.id, checked) } } } ... CheckElement { text: qsTr("In View") Layout.alignment: Qt.AlignRight onCheckedChanged: root.sortFilterModel.updateShowInView(checked) } CheckElement { text: qsTr("In Use") Layout.alignment: Qt.AlignRight onCheckedChanged: root.sortFilterModel.updateShowInUse(checked) }
Enregistrement du module QML
Construction CMake
Pour une construction basée sur CMake, nous devons ajouter ce qui suit au fichier CMakeLists.txt:
qt_add_qml_module(satelliteinfo
URI SatelliteInformation
VERSION 1.0
SOURCES
roles.h
satellitemodel.cpp satellitemodel.h
sortfiltermodel.cpp sortfiltermodel.h
QML_FILES
ApplicationScreen.qml
Button.qml
Header.qml
HelpPopup.qml
LegendBox.qml
Main.qml
RssiView.qml
PageButton.qml
PermissionsScreen.qml
PositionBox.qml
SatelliteView.qml
SettingsView.qml
SkyView.qml
Theme.qml
ViewSwitch.qml
RESOURCES
icons/checkbox.svg
icons/checkbox_blank.svg
icons/darkmode.svg
icons/filter.svg
icons/help.svg
icons/lightmode.svg
icons/place.svg
icons/qtlogo_green.png
icons/qtlogo_white.png
icons/rssiview.svg
icons/satellite_small.png
icons/satellite1.png
icons/satellite2.png
icons/search.svg
icons/settings.svg
icons/skyview.svg
icons/sort.svg
icons/tableview.svg
)qmake Build
Pour une compilation qmake, nous devons modifier le fichier satelliteinfo.pro de la manière suivante :
CONFIG += qmltypes
QML_IMPORT_NAME = SatelliteInformation
QML_IMPORT_MAJOR_VERSION = 1
qml_resources.files = \
qmldir \
ApplicationScreen.qml \
Button.qml \
Header.qml \
HelpPopup.qml \
LegendBox.qml \
Main.qml \
RssiView.qml \
PageButton.qml \
PermissionsScreen.qml \
PositionBox.qml \
SatelliteView.qml \
SettingsView.qml \
SkyView.qml \
Theme.qml \
ViewSwitch.qml
qml_resources.prefix = /qt/qml/SatelliteInformation
RESOURCES += qml_resources
icon_resources.files = \
icons/checkbox.svg \
icons/checkbox_blank.svg \
icons/darkmode.svg \
icons/filter.svg \
icons/help.svg \
icons/lightmode.svg \
icons/place.svg \
icons/qtlogo_green.png \
icons/qtlogo_white.png \
icons/rssiview.svg \
icons/satellite_small.png \
icons/satellite1.png \
icons/satellite2.png \
icons/search.svg \
icons/settings.svg \
icons/skyview.svg \
icons/sort.svg \
icons/tableview.svg
icon_resources.prefix = /qt/qml/SatelliteInformation
RESOURCES += icon_resourcesFichiers sources
Voir aussi Tous les exemples Qt, Qt Positioning Exemples, et Qt Quick Exemples et tutoriels.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.