2010-09-20 28 views
3

J'utilise le code suivant pour obtenir GeoLocation pour mon applicationQt: Mobilité GeoLocation travaille sur simulateur mais pas sur N900

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())); 
} 

Ce code fonctionne parfaitement sur le simulateur et me donne les coordonnées fournies par le simulateur mais cela ne fonctionne pas quand j'essaie de l'exécuter sur mon N900. Il renvoie Nan au lieu de la latitude et de la longitude. Le signal GPS actuel sur le téléphone est une précision grossière. La géolocalisation fonctionne également dans l'application OVI Maps sur le téléphone. Une idée de pourquoi le code ci-dessus est incapable d'obtenir la géolocalisation sur le téléphone mais fonctionne parfaitement sur le simulateur?

Répondre

2

Vous devez définir l'étiquette à partir de l'emplacement pour positionUpdated() lorsque le signal est déclenché lorsqu'une mise à jour a été reçue. Votre appel au requestUpdate() déclenche également le signal positionUpdated(). S'il ne reçoit pas de mise à jour après le réglage du délai d'attente, il signale requestTimeout() auquel vous pouvez éventuellement connecter un emplacement à titre informatif. Il est probable que lorsque vous récupérez lastKnownPosition(), aucune position n'a encore été déterminée et la valeur renvoyée est une valeur nulle. Il est difficile d'être sûr seulement de la documentation mais je pense que cela implique que requestUpdate() reviendra toujours immédiatement, pas après avoir reçu une mise à jour avec succès, donc vous devriez appeler source->lastKnownPosition.isValid() pour voir si elle contient une bonne position.

Vous devriez vraiment vérifier la position dans l'emplacement positionUpdated() ou après avoir appelé cet emplacement au moins une fois. Il est probable que le simulateur dispose d'une position disponible immédiatement et fonctionne dans ce cas.

Est-ce que votre emplacement positionUpdated() est appelé?