En esta página

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.

Vista de satélite e interfaz de tabla

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.

Vista RSSI con barras de señal de satélite

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ónDescripción
En ejecuciónLa aplicación consulta continuamente el sistema en busca de actualizaciones de satélites y posición. Cuando haya nuevos datos disponibles, se mostrarán.
DetenidoLa aplicación deja de actualizar la información sobre satélites y posición.
ÚnicoLa 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_resources

Archivos fuente

Proyecto de ejemplo @ code.qt.io

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.