Qt Mobile SDK 1.0 (beta) - Simulator & Qt Mobility
2010-05-02 15:20
Nach dem ich schon über QtMobility sowie meine ersten Eindrücke zum Qt Mobile SDK beta geschrieben habe, nun etwas mehr zum Simulator und QtMobility in der Praxis. Nach dem ich ein erstes HelloWorld Programm recht schnell geschrieben hatte, habe ich nun ein weiteres geschrieben, welches ein wenig die Möglichkeiten von QtMobility und des Simulators ausloten soll.
Qt Mobile Simulator
Um die Eigenschafen des Simulators besser kennenzulernen, kommt man an QtMobility nicht vorbei. Im Eigenschaftfenster finden sich zahlreiche Möglichkeiten verschiedene Einstellungen und Parameter zu ändern, und somit auch Events im Programm zu beinflussen:![]() |
|
HelloMobility
Aus den vielen Möglichkeiten des Simulators entschied ich mich in einer einfachen Anwendung erstmal Contacts, Location und Sensors zu testen. Jeweils ein Tab für jeden Test:
![]() |
Contacts QtMobility bietet hier einfachen Zugriff, man muss nur eine QContactManager Instanz erstellen, und diese dann mit contacts() nach der Liste der ihm bekannten Kontakte fragen. Man bekommt dann eine QList mit QContact Elementen. Durch diese kann man dann einfach iterieren, und muss für die verschiedenen Kontaktelemente jeweils eigene Abfrageobjekte an QContact übergeben: QContactPhoneNumber number = contact.detail<QContactPhoneNumber>(); if(!number.isEmpty()) ui->txt_nummer->setText( number.number()); Alles was man für einen einfachen Kontaktbrowser also braucht, ist eine QList, welche man vom Manager bekommt, und dann iteriert man durch diese. Auch gibt es einige Slots über die man die Liste aktualisieren könnte. Die Kontaktapi bietet neben dem Synchronen Zugriff auch asynchrone Methoden zum Zugriff auf die Kontaktdaten. |
![]() |
Location Die Location API von QtMobility bietet recht vielfältige Möglichkeiten, die eigene Position zu bestimmen. Über den Simulator lässt sich die Position des Gerätes verändern, dies kann man dann wiederum über das SIGNAL positionUpdated(QGeoPositionInfo) im Programm erfahren. Nur was macht man dann mit den Daten? Ein einfacher PositionLogger findet sich ja schon in den Beispielen, aber mich interessierte auch etwas anderes: Wohin zeigen die Defaultkoordinaten des Simulators? Was ist dort? Es gibt zur Zeit keinen MappingService für QtMobility, der Karten darstellen kann, es bleibt aber die Möglichkeit dies über das Web zu tun. Mit einem QWebView lade ich OpenStreetmap.org und lasse mir einfach die Position zentriert nach Latitude/Longitude anzeigen. Weitere Möglichkeiten im Simulator wären per Skripting das Bewegen des Gerätes zu simulieren, um z.b. bestimmte GeoEvents von QtMobility zu testen, oder auch verschiedene QGeoPositionInfoProvider zu testen. In den Examples zu QtMobility findet sich hier auch interessantes. |
![]() |
Sensors Mit der Sensor API bietet QtMobility Zugriff auf eine Vielzahl von Sensoren, welche heute häufig noch nicht in allen Geräten verbaut sind. Für die Zukunft dürften auch weitere Sensoren dazukommen, ebenfalls könnte man hier auch eigene Sensoren über Treiber anschließen. Für den Test verwendete ich Accelerometer und Compass. Beide lassen sich im Simulator recht einfach über Schieberegler verstellen, so das man in der Anwendung immer ein entsprechendes Feedback bekommen sollte. Aber dieses Beispiel zeigt auch andere Interessante Dinge, z.b. das Layout ist hier etwas unglücklich, da die im Designer korrekt angezeigten Elemente hier teilweise verschoben bzw. nicht voll dargestellt sind. Der erste Slider unter X ist kaum zu erkennen (die Punkte sollen Slider sein), auch sind die Labels für X,Y und Z im Designer Linksbündig, hier sind sie aufeinmal Rechts. |
Probleme und Lösungen
Bei der Umsetzung hatte ich einige kleinere Probleme. QtMobility liegt in einem gleichnamigen Namespace, das ist etwas ungewohnt für Qt, wenn auch sehr lobenswert. Ein using namespace QtMobility; erleichtert manchmal zwar die Arbeit, aber ist auch ziemlich unsauber. Dennoch kann es ohne dies zu Problemen kommen, so kommt connect nicht mit Namespaces klar, denn die SIGNALS sind ohne den Namespace definiert (ist ja im Namespace). So lässt sich ein void positionUpdated(const QtMobility::QGeoPositionInfo info) nicht an das SIGNAL(positionUpdated(QGeoPositionInfo)) binden. Es gibt allerdings einen Workarround, der verhindert, das man im Header den Namespace öffnen muss, mittels eines Typedefs lässt sich dies wieder gerade biegen:
typedef QtMobility::QGeoPositionInfo QGeoPositionInfo;
Durch das Typedef klappt es dann einwandfrei.
Ein weiteres Problem ist momentan das die Sensoren nicht im Simulator funktionieren, jedenfalls habe ich sie nicht zum Funktionieren gebracht. Auch findet sich (noch) kein Beispiel für die Sensoren, die Sensor API Dokumentation bleibt dort selber sehr vage, und es findet sich nur recht wenig Code dazu. Dies dürfte aber auch daran liegen, dass das SDK momentan ja noch im Beta Status ist.




