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:

tl_files/codenode/qtmobilesdk/qt_nokia_simulator.png
  • Simulate

    • Generic

      Hier kann man den Batterielevel verändern, sowie den Power State einstellen (Unknown Error, Battery, Wall, Wall and Charging). Ebenfalls kann man ein Profil auswählen, und das Gerät sperren.
    • Storage

      Die Eigenschaften und der Namen von Speichern/Storage Devices lassen sich hier einstellen. Man hat die Wahl zwischen Removable Drive und Internal Drive. Es lässt sich auch jeweils einstellen die Größe sowie wieviel davon schon belegt ist.
    • Network

      Alle wichtigen Netzwerkeigenschaften auf einen Blick:

      tl_files/codenode/qtmobilesdk/qt_nokia_simulator_network.png
    • Location

      Hier lässt sich die Position (Longitude, Latitude und Altitude) des Geräts einstellen, sowie der aktuelle Timestamp (als Current oder Override).
    • Contacts

      Zeigt die im Simulator bereits gespeicherten Kontakte an, ebenso kann man .vcf Dateien in den Simulator importieren.
    • Messaging

      Hier lassen sich eingehende Emails und SMS triggern. Sowie ein Mailverzeichnis importieren.
    • Sensors

      Einstellmöglichkeiten für Sensorwerte (Ambient Light, Accelerometer (x,y,z), Magnetometer (x,y,z,calibration Level), Compass (azimuth, calibration Level), Proximity Distance und Timestamp)
    • Scripting

      Hier lassen sich diverse Skripte starten, auch kann man sehen welche Skripte gerade laufen. Diese lassen sich anhalten und abbrechen.
  • Application

    Hier kann man den Fenstertitel sehen, sowie die Applikation im Simulator beenden.
  • View

    In diesem Subview lassen sich der verwendete Geräteskin (Maemo, Symbian) und der Zoom des Simulators verändern. Ebenfalls lässt sich das Gerät hier kippen.

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:

tl_files/codenode/qtmobilesdk/qt_nokia_n900_sim_v_contacts_small.png 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.





tl_files/codenode/qtmobilesdk/qt_nokia_n900_sim_v_location_small.png 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.





tl_files/codenode/qtmobilesdk/qt_nokia_n900_sim_v_sensors_small.png 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.

Zurück