Sur cette page

Informations sur les satellites

L'exemple « Informations sur les satellites » affiche les satellites disponibles à l'aide des vues « Sky View », « Table View » ou « RSSI View », ainsi que la position actuelle de l'utilisateur. Il est implémenté à l'aide de Qt Positioning et Qt Quick.

Cet exemple illustre l'utilisation de Qt Positioning QML API:

L'exemple montre également comment utiliser un modèle « C++ » personnalisé avec un modèle de proxy personnalisé disponible sur QML.

Exécution de l’exemple

Vous pouvez exécuter l’exemple à partir de :

Présentation de l’interface utilisateur

L'exemple affiche des informations sur les satellites dans trois onglets différents. Les données proviennent des propriétés SatelliteSource::satellitesInView et SatelliteSource::satellitesInUse.

Vue satellite et interface utilisateur sous forme de tableau

L'onglet « Sky View » affiche les positions relatives des satellites à l'aide des propriétés Azimuth et Elevation attributes . Un clic sur un objet satellite individuel ouvre une fenêtre contextuelle indiquant l'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 cette liste.

Affichage RSSI avec barres de signal satellite

L'onglet « RSSI View » affiche la puissance du signal des satellites visibles à l’aide de la propriété signalStrength. Les chiffres situés sous les barres représentent les valeurs individuelles de satellite identifiers.

Les onglets « Vue du ciel » et « Vue RSSI » affichent également la latitude et la longitude actuelles. Ils utilisent la propriété « PositionSource::position » pour extraire ces informations.

Le bloc « Status », situé au-dessus des onglets, affiche 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 selon trois modes différents :

Mode « Application »Description
En cours d'exécutionL'application interroge en permanence le système pour obtenir des mises à jour sur les satellites et la position. Dès que de nouvelles données sont disponibles, elles s'affichent.
ArrêtéL'application cesse de mettre à jour les informations relatives aux satellites et à la position.
UniqueL'application effectue une seule requête de mise à jour des données de position et des satellites.

L'application passe automatiquement en mode simulation si la plateforme ne fournit pas d'informations sur les satellites ou la position. Le mode simulation utilise un plugin NMEA contenant des données NMEA préenregistrées.

Remarque : Apple ne fournit aucune API permettant de récupérer des informations sur les satellites ; par conséquent, sur macOS et iOS, ces informations proviennent systématiquement de données préenregistrées. Ces limitations des API n’affectent pas les informations de positionnement ; la position actuelle peut donc s’afficher 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 position. Les chaînes de caractères représentant la latitude et 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

De la même manière que pour la position, les informations actuelles sur les satellites sont récupérées à partir de l’objet QML ` SatelliteSource `. Les gestionnaires ` onSatellitesInViewChanged ` et ` onSatellitesInUseChanged ` sont utilisés pour obtenir respectivement la liste mise à jour des satellites visibles et des satellites utilisés. 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 : cet exemple illustre à la fois l'API de positionnement QML et l'intégration d'un modèle C++ dans QML. C'est la raison pour laquelle les informations sur les satellites sont d'abord récupérées dans QML, puis transmises à C++, avant d'être renvoyées vers QML pour être utilisées dans le modèle. En pratique, si l'application est censée utiliser des modèles C++ complexes, il est préférable d'utiliser directement la classe QGeoSatelliteInfoSource disponible sur 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 ` dérive de ` QAbstractListModel ` et réimplémente les méthodes ` rowCount()`, ` data()` et ` roleNames()` pour représenter les informations relatives au 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é personnalisée ` size ` 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() ` sert à associer les rôles du modèle aux noms de propriétés permettant d’accéder aux données du modèle via QML. Par exemple, le nom ` id ` permet d’extraire l’identifiant du satellite, tandis que le nom ` rssi ` permet d’obtenir la puissance 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 récupérer les valeurs réelles. Par exemple, l’implémentation de RSSI View utilise les noms de rôles rssi, inUse et id pour tracer les barres représentant chaque satellite :

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 permettre 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éimplémente les méthodes filterAcceptsRow() et lessThan() pour permettre le filtrage et le tri. Le modèle expose également plusieurs slots permettant d’ajuster le comportement de filtrage et de 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 slots peuvent être appelés à la fois depuis C++ et QML. Par exemple, le délégué Satellite Identifier utilise le slot updateSelectedSystems() pour afficher ou masquer les informations concernant les satellites appartenant à certains systèmes satellitaires. De même, les délégués Satellite Status utilisent les slots updateShowInView() et updateShowInUse() pour filtrer les satellites présentant un statut 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 des modules QML

Compilation CMake

Pour une compilation via CMake, il faut 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
)
Compilation qmake

Pour une compilation avec qmake, il faut 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_resources

Fichiers source

Exemple de projet sur code.qt.io

Voir également Tous les exemples Qt, les exemples de `Qt Positioning ` et les exemples et tutoriels d’Qt Quick .

© 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.