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:
- Qt Creator
Öffnen Sie den „ Welcome “-Modus und wählen Sie das Beispiel unter Examples aus. Weitere Informationen finden Sie unter Qt Creator: Tutorial: Erstellen und Ausführen.
- Qt Extension for Visual Studio Code
Führen Sie den Befehl „ Qt: Open Qt examples “ aus dem Verzeichnis „ Command Palette “ aus und wählen Sie das Beispiel aus der Liste aus. Weitere Informationen finden Sie unter Qt Extension for Visual Studio Code: Tutorial: Erstellen und 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 “.

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.

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:
| Anwendungsmodus | Beschreibung |
|---|---|
| Laufend | Die Anwendung fragt das System kontinuierlich nach Satelliten- und Positionsaktualisierungen ab. Sobald neue Daten verfügbar sind, werden diese angezeigt. |
| Angehalten | Die Anwendung stellt die Aktualisierung der Satelliten- und Positionsdaten ein. |
| Einmalig | Die 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_resourcesQuelldateien
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.