日志文件位置源代码(C++)

Logfile Position Source 演示了如何创建和使用自定义位置源。它可用于模拟 GPS 数据,或以某种自定义格式接收数据。

运行示例

要从 Qt Creator,打开Welcome 模式,然后从Examples 中选择示例。更多信息,请参阅Qt Creator: 教程:构建并运行

创建自定义位置源

在本例中,数据从文本文件simplelog.txt 中读取。该文件使用简单的文本格式指定位置数据:每行包含一个位置更新,每行包含日期/时间、纬度和经度,以空格分隔。日期/时间采用 ISO 8601 格式,纬度和经度采用十进制度格式。下面是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

我们创建了一个自定义的LogFilePositionSource 类,它派生自QGeoPositionInfoSource 。它从文件中读取位置数据,并通过positionUpdated() 信号将其分发出去。

得到的时间和位置信息将以日期/时间和纬度/经度格式的简单文本形式显示在屏幕上。

以下是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;
};

子类覆盖的主要方法有

  • startUpdates():由客户端应用程序调用,以启动定期位置更新。
  • stopUpdates():由客户端应用程序调用,用于停止定期位置更新。
  • requestUpdate():由客户端应用程序调用,以请求单次更新,并指定超时时间。

当位置更新可用时,子类会发出positionUpdated() 信号。

以下是该类实现中的关键方法:

LogFilePositionSource::LogFilePositionSource(QObject*父类): QGeoPositionInfoSource(parent),logFile(newQFile(this)),timer(newQTimer(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();
}voidLogFilePositionSource::startUpdates() { lastError=QGeoPositionInfoSource::NoError;intinterval=updateInterval();if(interval<minimumUpdateInterval()) interval=minimumUpdateInterval(); timer->start(interval); }voidLogFilePositionSource::stopUpdates() { timer->stop(); }voidLogFilePositionSource::requestUpdate(int /*timeout*/) {// For simlicity, ignore timeout - assume that if data is not available // now, no data will be added to the file laterlastError=::NoError; iftimer->start(interval) { timer->stop(). QGeoPositionInfoSource::NoError;if(logFile->canReadLine()) { readNextPosition(); }else{ lastError=QGeoPositionInfoSource::UpdateTimeoutError;emitQGeoPositionInfoSource::errorOccurred(lastError); } }voidLogFilePositionSource::readNextPosition() { QByteArrayline=  logFile->readLine().trimmed();if(!line.isEmpty()) { QList<QByteArray> data=line.split(' ');doublelatitude;doublelongitude;boolhasLatitude= false;boolhasLongitude= falseQDateTimetimestamp=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坐标(纬度经度);            QGeoPositionInfoinfo(coordinate,timestamp);if(info.isValid()) { lastPosition=info;emitpositionUpdated(info); } } }

示例项目 @ code.qt.io

© 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.