Sur cette page

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.

Vue satellite et tableau UI

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.

Vue RSSI avec barres de signal satellite

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'applicationDescription de l'application
En cours d'exécutionL'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éeL'application cesse de mettre à jour les informations relatives aux satellites et à la position.
UniqueL'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_resources

Fichiers sources

Exemple de projet @ code.qt.io

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.