Quelle der Logdatei-Position (C++)
„Logfile Position Source“ zeigt, wie man eine benutzerdefinierte Positionsquelle erstellt und damit arbeitet. Dies kann nützlich sein, um GPS-Daten zu simulieren oder wenn die Daten in einem benutzerdefinierten Format empfangen werden.
Ausführen des Beispiels
Sie können das Beispiel ausführen unter:
- Qt Creator
Öffnen Sie den Modus „ Welcome “ und wählen Sie das Beispiel unter „ Examples “ aus. Weitere Informationen finden Sie unter Qt Creator: Tutorial: Erstellen und Ausführen.
- Qt Extension for Visual Studio Code
Führen Sie den Befehl „ Qt: Open Qt examples “ aus dem Verzeichnis „ Command Palette “ aus und wählen Sie das Beispiel aus der Liste aus. Weitere Informationen finden Sie unter Qt Extension for Visual Studio Code: Tutorial: Erstellen und Ausführen.
Erstellen einer benutzerdefinierten Positionsquelle
In diesem Beispiel werden die Daten aus einer Textdatei namens „simplelog.txt“ gelesen. Die Datei gibt Positionsdaten in einem einfachen Textformat an: Sie enthält pro Zeile eine Positionsaktualisierung, wobei jede Zeile ein Datum/eine Uhrzeit sowie einen Breiten- und Längengrad enthält, die durch Leerzeichen voneinander getrennt sind. Datum und Uhrzeit liegen im ISO-8601-Format vor, Breiten- und Längengrad im dezimalen Gradformat. Hier 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.092648Wir erstellen eine benutzerdefinierte Klasse „ LogFilePositionSource “, die von „ QGeoPositionInfoSource “ abgeleitet ist. Sie liest Positionsdaten aus der Datei und gibt sie über das Signal „ positionUpdated()“ weiter.
Die daraus resultierenden Zeit- und Positionsangaben werden dann auf dem Bildschirm als einfacher Text im Datums-/Zeit- sowie im Breitengrad-/Längengrad-Format 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 beenden.
- requestUpdate(): Wird von Client-Anwendungen aufgerufen, um eine einzelne Aktualisierung mit einem festgelegten Timeout anzufordern.
Sobald eine Positionsaktualisierung verfügbar ist, sendet die Unterklasse das Signal „ positionUpdated()“ aus.
Hier sind die wichtigsten Methoden in 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 wird das Timeout ignoriert – es wird davon ausgegangen, dass , wenn jetzt keine Daten verfügbar sind ,
// später auch keine Daten zur Datei hinzugefügt werden
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);
Breitengrad = data.value(1).toDouble(&hasLatitude);
Längengrad = data.value(2).toDouble(&hasLongitude);
if (hasLatitude&& hasLongitude&& timestamp.isValid()) {
QGeoCoordinate coordinate(Breitengrad, Längengrad);
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.