日志文件位置来源(C++)
“日志文件位置源”介绍了如何创建和使用自定义位置源。这在模拟 GPS 数据或接收自定义格式数据时会非常有用。
运行示例
您可以从以下位置运行该示例:
- Qt Creator
打开Welcome 模式,并从Examples 中选择该示例。有关更多信息,请参阅Qt Creator :教程:构建和运行。
- Qt Extension for Visual Studio Code
在Command Palette 中运行Qt: Open Qt examples 命令,并从列表中选择该示例。有关更多信息,请参阅Qt Extension for Visual Studio Code :教程:构建和运行。
创建自定义位置源
在此示例中,数据从文本文件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*parent)
: 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*/)
{
// 为简化起见,忽略超时——假设如果 当前 没有数据
// 那么之后也不会向文件中添加数据
lastError=QGeoPositionInfoSource::NoError;
if(logFile->canReadLine()) {
readNextPosition();
}else{
lastError=QGeoPositionInfoSource::UpdateTimeoutError;
emitQGeoPositionInfoSource::errorOccurred(lastError);
}
}
voidLogFilePositionSource::readNextPosition()
{
QByteArray line= logFile->readLine().trimmed();
if(!line.isEmpty()) {
QList<QByteArray>data=line.split(' ');
double纬度;
double经度;
bool是否包含纬度= false;
bool是否包含经度= false;
QDateTime timestamp=QDateTime::fromString(QString(data.value(0)),Qt::ISODate);
纬度=data.value(1).toDouble(&hasLatitude);
经度=data.value(2).toDouble(&hasLongitude);
if(hasLatitude&&hasLongitude&×tamp.isValid()) {
QGeoCoordinate coordinate(纬度,经度);
QGeoPositionInfo info(coordinate,timestamp);
if(info.isValid()) {
lastPosition=info;
emitpositionUpdated(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.