Protokolldatei Position Quelle (C++)
Logfile Position Source zeigt, wie man eine eigene Positionsquelle erstellt und damit arbeitet. Sie kann für die Simulation von GPS-Daten nützlich sein, oder wenn die Daten in einem benutzerdefinierten Format empfangen werden.
Ausführen des Beispiels
Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel unter Examples aus. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.
Erstellen einer benutzerdefinierten Positionsquelle
In diesem Beispiel werden die Daten aus einer Textdatei, simplelog.txt, gelesen. Die Datei gibt Positionsdaten in einem einfachen Textformat an: Sie enthält eine Positionsaktualisierung pro Zeile, wobei jede Zeile ein Datum/eine Uhrzeit, einen Breitengrad und einen Längengrad, getrennt durch Leerzeichen, enthält. Datum/Uhrzeit sind im Format ISO 8601, Breiten- und Längengrad sind im Dezimalformat. Hier ist ein Auszug aus 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
Wir erstellen eine benutzerdefinierte Klasse LogFilePositionSource
, die von QGeoPositionInfoSource abgeleitet ist. Sie liest die Positionsdaten aus der Datei und gibt sie über das Signal positionUpdated() weiter.
Die resultierenden Zeit- und Positionsdaten werden dann als einfacher Text im Format Datum/Uhrzeit und Breitengrad/Längengrad auf dem Bildschirm angezeigt.
Hier ist die Definition der Klasse 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; };
Die wichtigsten Methoden, die von der Unterklasse überschrieben werden, sind:
- startUpdates(): wird von Client-Anwendungen aufgerufen, um regelmäßige Positionsaktualisierungen zu starten.
- stopUpdates(): wird von Client-Anwendungen aufgerufen, um regelmäßige Positionsaktualisierungen zu stoppen.
- requestUpdate(): wird von Client-Anwendungen aufgerufen, um eine einzelne Aktualisierung mit einem bestimmten Timeout anzufordern.
Wenn eine Positionsaktualisierung verfügbar ist, sendet die Unterklasse das Signal positionUpdated().
Hier sind die wichtigsten Methoden der Klassenimplementierung:
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*/) { // Der Einfachheit halber ignorieren wir die Zeitüberschreitung - wir gehen davon aus, dass, wenn die Daten // jetzt nicht verfügbar sind , später keine Daten zur Datei hinzugefügt werdenlastError = 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); } } }
© 2025 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.