Información del satélite
El ejemplo de Información de Satélite muestra los satélites disponibles usando Vista Cielo, Vista Tabla o Vista RSSI y la posición actual del usuario. Se implementa con Qt Positioning y Qt Quick.
Este ejemplo demuestra el uso de Qt Positioning QML API:
El ejemplo también muestra cómo utilizar un modelo personalizado de C++ junto con un modelo proxy personalizado de QML.
Ejecución del ejemplo
Para ejecutar el ejemplo de Qt Creatorabra el modo Welcome y seleccione el ejemplo de Examples. Para obtener más información, consulte Qt Creator: Tutorial: Construir y ejecutar.
Paseo por la UI
El ejemplo muestra información del satélite en tres pestañas diferentes. Los datos se toman de las propiedades SatelliteSource::satellitesInView y SatelliteSource::satellitesInUse.

La pestaña Vista del cielo muestra las posiciones relativas de los satélites utilizando las propiedades Azimuth y Elevation attributes . Al hacer clic en un objeto satélite individual se abre una ventana emergente con satellite identifier, su acimut y elevación.
La pestaña Vista Tabla muestra la lista de todos los satélites detectados, y permite aplicar ordenación y filtrado a la lista.

La pestaña Vista RSSI muestra la intensidad de la señal de los satélites a la vista utilizando la propiedad signalStrength. Los números debajo de las barras representan cada uno de los satellite identifiers.
Las pestañas Vista del cielo y Vista RSSI también muestran la latitud y longitud actuales. Utilizan la propiedad PositionSource::position para extraer esta información.
El bloque Estado situado en la parte superior de las pestañas muestra el modo actual o el último error.
El menú Configuración permite cambiar el modo de color de la aplicación y mostrar la información de ayuda.
La aplicación funciona en tres modos diferentes:
| Modo de aplicación | Descripción |
|---|---|
| En ejecución | La aplicación consulta continuamente el sistema en busca de actualizaciones de satélites y posición. Cuando haya nuevos datos disponibles, se mostrarán. |
| Detenido | La aplicación deja de actualizar la información sobre satélites y posición. |
| Único | La aplicación realiza una única solicitud de actualización de satélites y posición. |
La aplicación cambia automáticamente a un modo de simulación si la plataforma no proporciona información de satélite o posición. El modo de simulación utiliza un plugin NMEA con datos NMEA pregrabados.
Nota: Apple no proporciona ninguna API para recuperar información de satélite, por lo que en macOS y iOS la información de satélite se tomará siempre de datos pregrabados. Estas limitaciones de la API no afectan a la información de posicionamiento, por lo que la posición actual puede mostrarse correctamente.
Recuperación de la posición actual
La posición actual se recupera del objeto QML PositionSource. El manejador onPositionChanged se utiliza para recibir actualizaciones de posición. Las representaciones de cadena de la latitud y la longitud se extraen de la propiedad coordinate.
PositionSource { id: positionSource name: root.simulation ? "nmea" : "" onPositionChanged: { let posData = position.coordinate.toString().split(", ") positionBox.latitudeString = posData[0] positionBox.longitudeString = posData[1] } }
Obtención de información sobre satélites
De forma similar a la posición, la información actual de los satélites se recupera del objeto QML SatelliteSource. Los manejadores onSatellitesInViewChanged y onSatellitesInUseChanged se utilizan para obtener los satélites actualizados a la vista y los satélites en uso, respectivamente. En este ejemplo, los datos se reenvían al modelo C++, que posteriormente se utiliza en todas las vistas.
SatelliteSource { id: satelliteSource name: root.simulation ? "nmea" : "" onSatellitesInViewChanged: root.satellitesModel.updateSatellitesInView(satellitesInView) onSatellitesInUseChanged: root.satellitesModel.updateSatellitesInUse(satellitesInUse) }
Nota: El ejemplo muestra tanto la API de Posicionamiento QML, como la integración del modelo C++ a QML. Esa es la razón por la que la información del satélite se recupera primero en QML, luego se reenvía a C++, y después vuelve a QML para ser utilizada en el modelo. En la práctica, si la aplicación debe utilizar modelos C++ complejos, considere utilizar directamente la clase QGeoSatelliteInfoSource de C++.
Uso de modelos C++ personalizados
El ejemplo utiliza dos modelos personalizados - SatelliteModel y SortFilterModel.
Modelo Satélite
La clase SatelliteModel deriva de QAbstractListModel y reimplementa los métodos rowCount(), data(), y roleNames() para representar la información del satélite. El uso de QAbstractListModel como clase base permite utilizar fácilmente el modelo con las clases QML ListView y Repeater. Una propiedad personalizada size se utiliza sólo en la pestaña Vista RSSI para calcular dinámicamente el ancho de las barras de la pestaña.
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(); };
El método roleNames() se utiliza para asignar los roles del modelo a los nombres de las propiedades que se pueden utilizar para acceder a los datos del modelo desde QML. Por ejemplo, el nombre id se utiliza para extraer el identificador del satélite, y el nombre rssi se utiliza para obtener la intensidad de la señal.
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"} }; }
En QML, podemos utilizar estos nombres para obtener los valores reales. Por ejemplo, la implementación de RSSI View utiliza los nombres de rol rssi, inUse, y id para dibujar las barras que representan satélites individuales:
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 } } }
Modelo Proxy
La clase SortFilterModel se utiliza para proporcionar ordenación y filtrado personalizados de los objetos satélite mostrados en la pestaña Vista Tabla.
El modelo deriva de QSortFilterProxyModel y reimplementa los métodos filterAcceptsRow() y lessThan() para proporcionar filtrado y ordenación. El modelo también expone varios slots para ajustar el comportamiento de filtrado y ordenación.
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; };
Estas ranuras se pueden llamar tanto desde C++ como desde QML. Por ejemplo, el delegado Satellite Identifier utiliza la ranura updateSelectedSystems() para mostrar u ocultar la información sobre los satélites pertenecientes a determinados sistemas de satélites. Del mismo modo, los delegados de Satellite Status utilizan las ranuras updateShowInView() y updateShowInUse() para filtrar los satélites con un estado específico.
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) }
Registro de módulos QML
Compilación CMake
Para una compilación basada en CMake, debemos añadir lo siguiente a 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
Para una compilación basada en qmake, necesitamos modificar el archivo satelliteinfo.pro de la siguiente manera:
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_resourcesArchivos fuente
Ver también Todos los Ejemplos Qt, Qt Positioning Ejemplos, y Qt Quick Ejemplos y Tutoriales.
© 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.