Source de la position du fichier journal (C++)
Logfile Position Source montre comment créer et utiliser une source de position personnalisée. Elle peut être utile pour simuler des données GPS ou lorsque les données sont reçues dans un format personnalisé.
Exécution de l'exemple
Pour exécuter l'exemple à partir de Qt Creatorouvrez le mode Welcome et sélectionnez l'exemple à partir de Examples. Pour plus d'informations, voir Qt Creator: Tutoriel : Construire et exécuter.
Création d'une position personnalisée Source
Dans cet exemple, les données sont lues à partir d'un fichier texte, simplelog.txt. Le fichier spécifie les données de position en utilisant un format texte simple : il contient une mise à jour de position par ligne, où chaque ligne contient une date/heure, une latitude et une longitude, séparées par des espaces. La date/heure est au format ISO 8601 et la latitude et la longitude sont au format degrés décimaux. Voici un extrait du fichier 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
Nous créons une classe LogFilePositionSource personnalisée, qui dérive de QGeoPositionInfoSource. Elle lit les données de position dans le fichier et les distribue via le signal positionUpdated().
Les informations relatives à l'heure et à la position sont ensuite affichées à l'écran sous la forme d'un simple texte au format date/heure et latitude/longitude.
Voici la définition de la classe 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; };
Les principales méthodes remplacées par la sous-classe sont les suivantes :
- startUpdates() : appelée par les applications clientes pour démarrer les mises à jour régulières de la position.
- stopUpdates() : appelée par les applications clientes pour arrêter les mises à jour régulières de la position.
- requestUpdate() : appelée par les applications clientes pour demander une seule mise à jour, avec un délai spécifié.
Lorsqu'une mise à jour de la position est disponible, la sous-classe émet le signal positionUpdated().
Voici les principales méthodes de l'implémentation de la classe :
LogFilePositionSource::LogFilePositionSource(QObject *parent) : QGeoPositionInfoSource(parent),logFile(new QFile(this)),timer(new QTimer(this)) { connect(timer, &QTimer::timeout, this, &LogFilePositionSource::readNextPosition) ; logFile->setFileName(":/simplelog.txt") ; if (!logFile->open(QIODevice::ReadOnly)) 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*/) { // Pour simplifier, ignorez le timeout - supposez que si les données ne sont pas // disponibles maintenant, aucune donnée ne sera ajoutée au fichier plus tardlastError = 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 coordinate(latitude, longitude) ; QGeoPositionInfo info(coordinate, 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.