Source de la position dans le fichier journal (C++)
La section « Source de position du fichier journal » explique comment créer et utiliser une source de position personnalisée. Cela peut s'avérer utile pour simuler des données GPS ou lorsque les données sont reçues dans un format personnalisé.
Exécution de l'exemple
Vous pouvez exécuter l'exemple à partir de :
- Qt Creator
Ouvrez le mode « Welcome » et sélectionnez l'exemple dans « Examples ». Pour plus d'informations, consultez Qt Creator: Tutoriel : Compiler et exécuter.
- Qt Extension for Visual Studio Code
Exécutez la commande « Qt: Open Qt examples » à partir de Command Palette, puis sélectionnez l'exemple dans la liste. Pour plus d'informations, consultez Qt Extension for Visual Studio Code: Tutoriel : Compiler et exécuter.
Création d’une source de position personnalisée
Dans cet exemple, les données sont lues à partir d’un fichier texte, simplelog.txt. Ce fichier spécifie des données de position dans un format texte simple : il contient une mise à jour de position par ligne, chaque ligne comportant une date/heure, une latitude et une longitude, séparées par des espaces. La date et l'heure sont au format ISO 8601, tandis que la latitude et la longitude sont exprimées en 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.092648Nous créons une classe personnalisée « LogFilePositionSource », qui hérite de « QGeoPositionInfoSource ». Elle lit les données de position à partir du fichier et les diffuse via le signal « positionUpdated() ».
Les informations de date et de position ainsi obtenues s’affichent ensuite à l’écran sous forme de texte simple, 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 redéfinies par la sous-classe sont les suivantes :
- startUpdates(): appelée par les applications clientes pour lancer les mises à jour régulières de 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 mise à jour unique, avec un délai d'expiration spécifié.
Lorsqu'une mise à jour de position est disponible, la sous-classe émet le signal ` positionUpdated()`.
Voici les méthodes clés 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*/)
{
// Par souci de simplicité, ignorez le délai d'expiration : partons du principe que si aucune donnée n’est disponible
// à l’instant, aucune donnée ne sera ajoutée au fichier ultérieurement
lastError = 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.