Qt: Mobility GeoLocation работает на симуляторе, но не на N900 - PullRequest
3 голосов
/ 20 сентября 2010

Я использую следующий код, чтобы получить 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 на телефоне. Любая идея, почему приведенный выше код не может получить геолокации на телефоне, но отлично работает на симуляторе?

1 Ответ

2 голосов
/ 21 сентября 2010

Вы должны установить метку из слота для positionUpdated(), так как сигнал запускается при получении обновления.Ваш звонок на requestUpdate() также вызывает сигнал positionUpdated().Если он не получит обновление после установки тайм-аута, он выдаст сигнал requestTimeout(), к которому вы можете подключить слот для информационных целей.Вполне вероятно, что при извлечении lastKnownPosition() позиция еще не определена, и возвращаемое значение является нулевым значением.Трудно быть уверенным только из документации, но я думаю, что это подразумевает, что requestUpdate() всегда будет возвращаться немедленно, а не после того, как оно успешно получит обновление, поэтому вы должны позвонить source->lastKnownPosition.isValid(), чтобы узнать, содержит ли оно хорошую позицию.

Вы действительно должны проверять положение в слоте positionUpdated() или после того, как этот слот был вызван хотя бы один раз.Скорее всего, у симулятора есть доступная позиция, и в этом случае он работает.

Ваш слот positionUpdated() когда-нибудь вызывался?

...