Auf dieser Seite

Satelliteninfo

Das Beispiel „Satelliteninfo“ zeigt die verfügbaren Satelliten in der Sky-Ansicht, der Tabellenansicht oder der RSSI-Ansicht sowie die aktuelle Position des Benutzers an. Es wurde mit Qt Positioning und Qt Quick.

Dieses Beispiel veranschaulicht die Verwendung von Qt Positioning QML API:

Das Beispiel zeigt außerdem, wie ein benutzerdefiniertes „ C++ “-Modell zusammen mit einem benutzerdefinierten Proxy-Modell von QML verwendet wird.

Ausführen des Beispiels

Sie können das Beispiel wie folgt ausführen:

Einführung in die Benutzeroberfläche

Das Beispiel zeigt Satelliteninformationen in drei verschiedenen Registerkarten an. Die Daten stammen aus den Eigenschaften „ SatelliteSource::satellitesInView “ und „ SatelliteSource::satellitesInUse “.

Satellitenansicht und Tabellen-Benutzeroberfläche

Die Registerkarte „Sky View“ zeigt die relativen Satellitenpositionen unter Verwendung der Eigenschaften „ Azimuth “ und „ Elevation “ attributes an. Durch Klicken auf ein einzelnes Satellitenobjekt wird ein Popup-Fenster mit der „ satellite identifier “, dem Azimut und der Elevation geöffnet.

Die Registerkarte „Tabellenansicht“ zeigt die Liste aller erkannten Satelliten an und ermöglicht das Sortieren und Filtern der Liste.

RSSI-Anzeige mit Satellitensignalbalken

Die Registerkarte „RSSI-Ansicht“ zeigt die Signalstärke der sichtbaren Satelliten mithilfe der Eigenschaft „ signalStrength “ an. Die Zahlen unter den Balken stehen für die einzelnen „ satellite identifiers “.

Die Registerkarten „Sky View“ und „RSSI View“ zeigen zudem den aktuellen Breiten- und Längengrad an. Sie nutzen die Eigenschaft „ PositionSource::position “, um diese Informationen zu extrahieren.

Der Statusblock oberhalb der Registerkarten zeigt den aktuellen Modus oder den letzten Fehler an.

Über das Menü „Einstellungen“ können Sie den Farbmodus der Anwendung umschalten und die Hilfeinformationen aufrufen.

Die Anwendung arbeitet in drei verschiedenen Modi:

AnwendungsmodusBeschreibung
LaufendDie Anwendung fragt das System kontinuierlich nach Satelliten- und Positionsaktualisierungen ab. Sobald neue Daten verfügbar sind, werden diese angezeigt.
AngehaltenDie Anwendung stellt die Aktualisierung der Satelliten- und Positionsdaten ein.
EinmaligDie Anwendung sendet eine einzelne Anfrage zur Aktualisierung der Satelliten- und Positionsdaten.

Die Anwendung wechselt automatisch in einen Simulationsmodus, wenn die Plattform keine Satelliten- oder Positionsdaten bereitstellt. Der Simulationsmodus verwendet ein NMEA-Plugin mit vorab aufgezeichneten NMEA-Daten.

Hinweis: Apple stellt keine APIs zum Abrufen von Satellitendaten bereit, daher werden auf macOS und iOS die Satellitendaten stets aus vorab aufgezeichneten Daten bezogen. Diese API-Einschränkungen haben keinen Einfluss auf die Positionsdaten, sodass die aktuelle Position korrekt angezeigt werden kann.

Abrufen der aktuellen Position

Die aktuelle Position wird aus dem QML-Objekt „ PositionSource “ abgerufen. Der Handler „ onPositionChanged “ wird verwendet, um Positionsaktualisierungen zu empfangen. Die Zeichenfolgendarstellungen von Breiten- und Längengrad werden aus der Eigenschaft „ coordinate “ extrahiert.

PositionSource {
    id: positionSource
    name: root.simulation ? "nmea" : ""
    onPositionChanged: {
        let posData = position.coordinate.toString().split(", ")
        positionBox.latitudeString = posData[0]
        positionBox.longitudeString = posData[1]
    }
}

Abrufen von Satelliteninformationen

Ähnlich wie bei der Position werden die aktuellen Satelliteninformationen aus dem QML-Objekt „ SatelliteSource “ abgerufen. Die Handler „ onSatellitesInViewChanged “ und „ onSatellitesInUseChanged “ werden verwendet, um jeweils die aktualisierten Satelliten im Sichtbereich und die derzeit genutzten Satelliten abzurufen. In diesem Beispiel werden die Daten anschließend an das Modell „ C++ “ weitergeleitet, das später in allen Ansichten verwendet wird.

SatelliteSource {
    id: satelliteSource
    name: root.simulation ? "nmea" : ""
    onSatellitesInViewChanged: root.satellitesModel.updateSatellitesInView(satellitesInView)
    onSatellitesInUseChanged: root.satellitesModel.updateSatellitesInUse(satellitesInUse)
}

Hinweis: Das Beispiel veranschaulicht sowohl die QML-Positionierungs-API als auch die Integration eines C++-Modells in QML. Aus diesem Grund werden die Satelliteninformationen zunächst in „ QML “ abgerufen, dann an „ C++ “ weitergeleitet und anschließend zurück an „ QML “ gesendet, um im Modell verwendet zu werden. In der Praxis sollten Sie, wenn die Anwendung komplexe „ C++ “-Modelle verwenden soll, in Erwägung ziehen, direkt die Klasse „ QGeoSatelliteInfoSource “ aus „ C++ “ zu verwenden.

Verwendung benutzerdefinierter C++-Modelle

Das Beispiel verwendet zwei benutzerdefinierte Modelle – SatelliteModel und SortFilterModel.

Satellitenmodell

Die Klasse „ SatelliteModel “ leitet sich von „ QAbstractListModel “ ab und implementiert die Methoden „ rowCount()“, „ data()“ und „ roleNames()“ neu, um die Satelliteninformationen darzustellen. Die Verwendung von „ QAbstractListModel “ als Basisklasse ermöglicht die einfache Nutzung des Modells mit den Typen „ QML “, „ ListView “ und „ Repeater “. Eine benutzerdefinierte Eigenschaft „ size “ wird ausschließlich auf der Registerkarte „RSSI View“ verwendet, um die Breite der Registerkartenleisten dynamisch zu berechnen.

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();
};

Die Methode „ roleNames() “ dient dazu, die Rollen des Modells den Eigenschaftsnamen zuzuordnen, über die auf die Modelldaten von QML zugegriffen werden kann. So wird beispielsweise der Name „ id “ verwendet, um die Satellitenkennung abzurufen, und der Name „ rssi “, um die Signalstärke zu ermitteln.

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"}
    };
}

Auf der Seite „ QML “ können wir diese Namen verwenden, um die tatsächlichen Werte abzurufen. Beispielsweise nutzt die Implementierung von „RSSI View“ die Rollennamen „ rssi “, „ inUse “ und „ id “, um die Balken zu zeichnen, die die einzelnen Satelliten darstellen:

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
        }
    }
}
Proxy-Modell

Die Klasse „ SortFilterModel “ dient dazu, eine benutzerdefinierte Sortierung und Filterung der auf der Registerkarte „Tabellenansicht“ angezeigten Satellitenobjekte zu ermöglichen.

Das Modell ist von „ QSortFilterProxyModel “ abgeleitet und implementiert die Methoden „ filterAcceptsRow()“ und „ lessThan()“ neu, um Filterung und Sortierung zu ermöglichen. Das Modell stellt außerdem mehrere „ slots “ bereit, um das Filter- und Sortierverhalten anzupassen.

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;
};

Diese Slots können sowohl von „ C++ “ als auch von „ QML “ aufgerufen werden. Beispielsweise verwendet der Delegat „Satellite Identifier“ den Slot „ updateSelectedSystems() “, um Informationen über Satelliten, die zu bestimmten Satellitensystemen gehören, ein- oder auszublenden. Ebenso verwenden die Delegaten „Satellite Status“ die Slots „ updateShowInView() “ und „ updateShowInUse() “, um die Satelliten mit einem bestimmten Status zu filtern.

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)
}

Registrierung von QML-Modulen

CMake-Build

Für einen CMake-basierten Build müssen wir Folgendes zur Datei „ CMakeLists.txt “ hinzufügen:

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

Für einen qmake-Build müssen wir die Datei „ satelliteinfo.pro “ wie folgt anpassen:

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

Quelldateien

Beispielprojekt auf code.qt.io

Siehe auch Alle Qt-Beispiele, Beispiele für „Qt Positioning “ sowie Beispiele und Tutorials zu „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.