3

次のコードを使用して、アプリの GeoLocation を取得します

QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(this);
if (source) {
    source->setUpdateInterval(1000); // time in milliseconds
    source->setPreferredPositioningMethods(QGeoPositionInfoSource::AllPositioningMethods);
    connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(positionUpdated(QGeoPositionInfo)));
    source->startUpdates();
    source->requestUpdate(30000);
    const QGeoPositionInfo &info =source->lastKnownPosition();            
    ui->label->setText(QString("Latitude - %1  Longitude - %2").arg(info.coordinate().latitude()).arg(info.coordinate().longitude()));
}

このコードはシミュレーターで完全に実行され、シミュレーターによって提供される座標が得られますが、N900 で実行しようとすると機能しません。緯度と経度の座標ではなく、Nan を返します。電話の現在の GPS 信号の精度は粗いです。また、携帯電話の OVI Maps アプリでジオロケーションが機能しています。上記のコードが電話で地理位置情報を取得できないのに、シミュレーターで完全に機能する理由は何ですか?

4

1 に答える 1

2

positionUpdated()更新が受信されたときにシグナルが発生するため、スロットからラベルを設定する必要があります。への呼び出しrequestUpdate()もシグナルをトリガーしpositionUpdated()ます。タイムアウト設定後に更新を取得しない場合はrequestTimeout()、情報目的でスロットを接続する必要がある可能性があることを通知します。を取得したときにlastKnownPosition()、まだ位置が決定されておらず、返された値が null 値である可能性があります。ドキュメントだけで確認するのは難しいrequestUpdate()ですが、更新を正常に受信した後ではなく、常にすぐに戻ることを意味していると思いますのでsource->lastKnownPosition.isValid()、適切な位置が含まれているかどうかを確認するために電話する必要があります.

スロット内の位置を確認するpositionUpdated()か、そのスロットが少なくとも 1 回呼び出された後に確認する必要があります。シミュレーターにはすぐに利用できる位置があり、その場合に機能する可能性があります。

あなたのpositionUpdated()スロットは呼び出されますか?

于 2010-09-21T01:57:05.947 に答える