Origen de la posición del archivo de registro (C++)
Logfile Position Source muestra cómo crear y trabajar con una fuente de posición personalizada. Puede ser útil para simular datos GPS, o cuando los datos se reciben en algún formato personalizado.
Ejecutando el Ejemplo
Para ejecutar el ejemplo desde Qt Creator, abra el modo Welcome y seleccione el ejemplo de Examples. Para más información, consulte Qt Creator: Tutorial: Construir y ejecutar.
Creación de una fuente de posición personalizada
En este ejemplo, los datos se leen desde un archivo de texto, simplelog.txt. El archivo especifica los datos de posición utilizando un formato de texto simple: contiene una actualización de posición por línea, donde cada línea contiene una fecha/hora, una latitud y una longitud, separadas por espacios. La fecha/hora está en formato ISO 8601 y la latitud y longitud están en formato de grados decimales. He aquí un extracto de simplelog.txt:
2009-08-24T22:25:01 -27.576082 153.092415 2009-08-24T22:25:02 -27.576223 153.092530 2009-08-24T22:25:03 -27.576364 153.092648
Creamos una clase personalizada LogFilePositionSource, que deriva de QGeoPositionInfoSource. Lee los datos de posición del fichero y los distribuye a través de la señal positionUpdated().
La información de tiempo y posición resultante se muestra en la pantalla como texto simple en formato fecha/hora y latitud/longitud.
He aquí la definición de la clase LogFilePositionSource:
class LogFilePositionSource : public QGeoPositionInfoSource { Q_OBJECT public: LogFilePositionSource(QObject *parent = 0); QGeoPositionInfo lastKnownPosition(bool satelliteMethodsOnly = false) const override; PositioningMethods supportedPositioningMethods() const override; int minimumUpdateInterval() const override; Error error() const override; public slots: virtual void startUpdates() override; virtual void stopUpdates() override; virtual void requestUpdate(int timeout = 5000) override; private slots: void readNextPosition(); private: QFile *logFile; QTimer *timer; QGeoPositionInfo lastPosition; Error lastError = QGeoPositionInfoSource::NoError; };
Los principales métodos sobreescritos por la subclase son:
- startUpdates(): llamado por las aplicaciones cliente para iniciar las actualizaciones regulares de posición.
- stopUpdates(): Llamado por las aplicaciones cliente para detener las actualizaciones regulares de posición.
- requestUpdate(): llamado por aplicaciones cliente para solicitar una única actualización, con un tiempo de espera especificado.
Cuando una actualización de posición está disponible, la subclase emite la señal positionUpdated().
Estos son los métodos clave en la implementación de la clase:
LogFilePositionSource::LogFilePositionSource(QObject *parent) : QGeoPositionInfoSource(padre),logFile(new QFile(this)),timer(new QTimer(this)) { connect(temporizador, &QTimer::timeout, this, &LogFilePositionSource::readNextPosition); logFile->setFileName(":/simplelog.txt"); if (!logFile->open(QIODevice::SóloLectura)) qWarning() << "Error: cannot open source file" << logFile->fileName(); }void LogFilePositionSource::startUpdates() { lastError = QGeoPositionInfoSource::NoError; int interval = updateInterval(); if (interval < minimumUpdateInterval()) interval = minimumUpdateInterval(); timer->start(interval); }void LogFilePositionSource::stopUpdates() { timer->stop(); }void LogFilePositionSource::requestUpdate(int /*timeout*/) { // Por simplicidad, ignorar timeout - asumir que si los datos no están disponibles // ahora, no se añadirán datos al archivo más tardelastError = QGeoPositionInfoSource::NoError; if (logFile->canReadLine()) { readNextPosition(); } else { lastError = QGeoPositionInfoSource::UpdateTimeoutError; emit QGeoPositionInfoSource::errorOccurred(lastError); } }void LogFilePositionSource::readNextPosition() { QByteArray line = logFile->readLine().trimmed(); if (!line.isEmpty()) { QList<QByteArray> data = line.split(' '); double latitude; double longitude; bool hasLatitude = false; bool hasLongitude = false; QDateTime timestamp = QDateTime::fromString(QString(data.value(0)), Qt::ISODate); latitude = data.value(1).toDouble(&hasLatitude); longitude = data.value(2).toDouble(&hasLongitude); if (hasLatitude && hasLongitude && timestamp.isValid()) { QGeoCoordinate coordenada(latitud, longitud); QGeoPositionInfo info(coordenada, timestamp); if (info.isValid()) { lastPosition = info; emit positionUpdated(info); } } }
© 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.