ログファイルポジションソース(C++)

ログファイル・ポジション・ソースは、カスタム・ポジション・ソースの作成と操作方法を示します。GPSデータをシミュレートしたり、カスタムフォーマットでデータを受信する場合に便利です。

例の実行

からサンプルを実行するには Qt Creatorからサンプルを実行するには、Welcome モードを開き、Examples からサンプルを選択します。詳細については、Building and Running an Exampleを参照してください。

カスタムポジションソースの作成

この例では、データはテキストファイルsimplelog.txtから読み込まれます。このファイルは、単純なテキスト形式を使用して位置データを指定します。1行に1つの位置更新が含まれ、各行には日付/時刻、緯度、経度がスペースで区切られています。日付/時刻はISO 8601フォーマットで、緯度と経度は10進法である。以下は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

QGeoPositionInfoSource から派生したカスタムクラス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(): クライアント・アプリケーションが、指定されたタイムアウトで1回の更新を要求するために呼び出されます。

位置の更新が可能になると、サブクラスはpositionUpdated() シグナルを発信します。

以下は、クラス実装の主なメソッドです:

LogFilePositionSource::LogFilePositionSource(QObjectlogFilePositionSource::LogFilePositionSource(*parent) : QGeoPositionInfoSource(parent),logFile(newQFile(this)),timer(newQTimer(this)) { connect(タイマー, &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() { } } void LogFilePositionSource::readNextPosition() { QByteArrayline=  logFile->readLine().trimmed();if(!line.isEmpty()) { } } void LogFilePositionSource::readNextPosition()        QList<QByteArray> data=line.split(' ');doublelatitude;doublelongitude;boolhasLatitude= false;boolhasLongitude= falseQDateTimeタイムスタンプ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.