ログファイルの位置の取得元 (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` からデータを読み込みます。このファイルは、シンプルなテキスト形式で位置データを指定しています。1 行につき 1 つの位置更新情報が含まれており、各行には日付/時刻、緯度、経度がスペースで区切られて記載されています。 日付/時刻は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.092648QGeoPositionInfoSource を継承したカスタムクラス「LogFilePositionSource 」を作成します。このクラスはファイルから位置データを読み取り、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(' ');
doublelatitude;
doublelongitude;
boolhasLatitude= false;
boolhasLongitude= 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&×tamp.isValid()) {
QGeoCoordinate coordinate(latitude,longitude);
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.