Fundamental use cases for porting iPhone and Android applications to Qt
(Ilkkal - - →Media Usage: factored away qwidget stuff) |
(Ilkkal - gameenabler mention) |
||
| Line 1: | Line 1: | ||
| − | [[Category:Porting]][[Category:Qt Quick]] | + | [[Category:Porting]][[Category:Qt]][[Category:Qt Quick]] |
{{UnderConstruction}} | {{UnderConstruction}} | ||
| − | |||
| − | This article introduces some fundamental use cases that developers porting applications from iPhone and Android will need to implement, and discusses sample solutions. In | + | This article introduces some fundamental use cases that developers porting applications from iPhone and Android will need to implement, and discusses sample solutions. In general, Qt provides all modern classes and functionalities familiar from iPhone and Android. This makes it easy to keep the application logic close to the original when porting (see [http://doc.qt.nokia.com/main-snapshot/classes.html Snapshot of Qt classes]). |
== Using Internet Services == | == Using Internet Services == | ||
| − | Mobile | + | Mobile applications are extremely likely to use the Internet — whether loading news stories from a server, using a remote service API such as Facebook or Twitter, or uploading photos to a photo-sharing service. |
| − | While | + | While protocols and service APIs vary considerably, it is very typical that the traffic happens on top of the HTTP protocol and is described as XML or JSON content. |
| − | The QNetworkAccessManager | + | The QNetworkAccessManager class[http://doc.qt.nokia.com/4.7/qnetworkaccessmanager.html] makes it easy to interact with remote services. The class handles common configuration and settings for the requests it sends, such as settings for proxies and caching. The API is asynchronous and uses signals to notify clients about events such as finished requests. QNetworkAccessManager supports HTTP(S) and FTP. |
A simple example of retrieving data using an URL asynchronously: (''replyFinished()'' slot is called upon completion) | A simple example of retrieving data using an URL asynchronously: (''replyFinished()'' slot is called upon completion) | ||
| Line 85: | Line 84: | ||
Third, as the actual size of the WebView changes according to the loaded page, | Third, as the actual size of the WebView changes according to the loaded page, | ||
the WebView is anchored in the Flickable only by its top and left edges. | the WebView is anchored in the Flickable only by its top and left edges. | ||
| + | |||
| + | == OpenGL ES Graphics using Qt GameEnabler == | ||
| + | |||
| + | It is easy to integrate OpenGL ES graphics into Qt applications using Qt's OpenGL module. [http://projects.developer.nokia.com/qtgameenabler Qt GameEnabler] takes the integration one step further by providing a simple starting point for game development, including not only graphics, but also audio playback and input event handling. By downloading a Qt GameEnabler release you get a project template that you can then start customizing and extending. | ||
| + | |||
| + | For a step-by-step introduction to Qt Game Enabler, see [[How to utilise OpenGL ES 2.0 on Symbian^3 and Maemo#Native OpenGL with Qt application framework using Qt GameEnabler this guide]]. | ||
== Media Usage == | == Media Usage == | ||
| Line 141: | Line 146: | ||
== Application Data Storage == | == Application Data Storage == | ||
| − | SQLite | + | SQLite has changed the way you store and read data easily in mobile applications, and there's no reason to change it. Qt allows the application to use either the device's own SQLite database or include one inside Qt project. |
| − | In addition to features that are | + | In addition to features that are familiar from iPhone and Android, Qt also provides an offline storage API. With the offline storage API, you can use SQLite directly from QML code with an intuitive JavaScript interface. |
[http://doc.qt.nokia.com/4.7-snapshot/qdeclarativeglobalobject.html Read more] | [http://doc.qt.nokia.com/4.7-snapshot/qdeclarativeglobalobject.html Read more] | ||
| Line 149: | Line 154: | ||
Qt provides several different methods for storing data. | Qt provides several different methods for storing data. | ||
| − | Simple | + | Simple data, such as application settings, is easily handled with QSettings [http://doc.trolltech.com/main-snapshot/qsettings.html]. All details are handled automatically: |
<code cpp> | <code cpp> | ||
QSettings settings("CompanyName", "ApplicationName"); | QSettings settings("CompanyName", "ApplicationName"); | ||
| Line 157: | Line 162: | ||
</code> | </code> | ||
| − | More | + | More complex data can be serialized into a binary form using QDataStream [http://doc.trolltech.com/main-snapshot/qdatastream.html]. |
| − | Serialization | + | Serialization of C++'s basic data types, such as char, short, int and char*, is automatic. Serialization of more complex data is accomplished by breaking up the data into these primitive units. An XML format for data storage is available with QtXml [http://doc.trolltech.com/main-snapshot/qtxml.html], which provides a stream reader and writer for XML documents, and C++ implementations of SAX and DOM. |
| − | The most powerful data storage method is | + | The most powerful data storage method is QtSql [http://doc.trolltech.com/main-snapshot/qtsql.html], which provides full SQL database functionalities. The following snippet creates a to-do list into a local database, inserts some data there, and reads it back selectively. |
<code cpp> | <code cpp> | ||
| Line 185: | Line 190: | ||
== Useful features for porting == | == Useful features for porting == | ||
| − | This | + | This section covers some of the most common features and examples for porting cases, grouped by typical applications. Application sketches on the left side of this document illustrate common application types on iPhone and Android devices. UI component images on the right show some of the most common Maemo/Nokia N900 elements used for building native-like user experiences. |
{| | {| | ||
| Line 195: | Line 200: | ||
| '''QML ListView''' The ListView element provides a list or icon view onto a model. [http://doc.qt.nokia.com/latest/qml-listview.html Read more] | | '''QML ListView''' The ListView element provides a list or icon view onto a model. [http://doc.qt.nokia.com/latest/qml-listview.html Read more] | ||
|- | |- | ||
| − | | '''QML Column''' The Column element provides a | + | | '''QML Column''' The Column element provides a vertical layout for managing other QML elements. [http://doc.qt.nokia.com/latest/qml-column.html Read more] |
|- | |- | ||
| '''Example: Dynamic linking''' Plug & Paint example demonstrates how to write Qt applications that can be extended through dynamically loaded plugins [http://doc.qt.nokia.com/4.7-snapshot/tools-plugandpaint.html Open] | | '''Example: Dynamic linking''' Plug & Paint example demonstrates how to write Qt applications that can be extended through dynamically loaded plugins [http://doc.qt.nokia.com/4.7-snapshot/tools-plugandpaint.html Open] | ||
| Line 223: | Line 228: | ||
| '''Feature: View transform''' By applying a transformation to the view, you can easily add support for common navigation features such as zooming and rotating [http://doc.qt.nokia.com/4.7-snapshot/graphicsview.html#zooming-and-rotating Read more] | | '''Feature: View transform''' By applying a transformation to the view, you can easily add support for common navigation features such as zooming and rotating [http://doc.qt.nokia.com/4.7-snapshot/graphicsview.html#zooming-and-rotating Read more] | ||
|- | |- | ||
| − | | '''Example: Drawing''' Basic Drawing | + | | '''Example: Drawing''' Basic Drawing example shows how to display basic graphics primitives in a variety of styles [http://doc.qt.nokia.com/4.7-snapshot/painting-basicdrawing.html Open] |
|- | |- | ||
| − | | '''Example: Complex paths''' Painter Paths | + | | '''Example: Complex paths''' Painter Paths example shows how painter paths can be used to build complex shapes for rendering [http://doc.qt.nokia.com/4.7-snapshot/painting-painterpaths.html Open] |
|- | |- | ||
| '''Feature: Draw path''' Draws the given painter path using the current pen for outline and the current brush for filling [http://doc.qt.nokia.com/4.7-snapshot/qpainter.html#drawPath Read more] | | '''Feature: Draw path''' Draws the given painter path using the current pen for outline and the current brush for filling [http://doc.qt.nokia.com/4.7-snapshot/qpainter.html#drawPath Read more] | ||
| Line 243: | Line 248: | ||
| '''Example: XML with DOM''' QDomDocument enable developers to access the contents of XML files using a Document Object Model (DOM) API. Simple DOM Model example shows how to use it. [http://doc.qt.nokia.com/4.7-snapshot/itemviews-simpledommodel.html Open] | | '''Example: XML with DOM''' QDomDocument enable developers to access the contents of XML files using a Document Object Model (DOM) API. Simple DOM Model example shows how to use it. [http://doc.qt.nokia.com/4.7-snapshot/itemviews-simpledommodel.html Open] | ||
|- | |- | ||
| − | | '''Example: Image composition''' Image | + | | '''Example: Image composition''' Image Composition example demonstrates the powerful image composition features supported in Qt. [http://doc.qt.nokia.com/4.7-snapshot/painting-imagecomposition.html Open] |
|- | |- | ||
| − | | '''Example: Advanced composition''' Composition | + | | '''Example: Advanced composition''' Composition demo shows some of the more advanced composition modes supported by Qt [http://doc.qt.nokia.com/4.7-snapshot/demos-composition.html Open] |
|- | |- | ||
| '''Example: SVG viewer''' SVG Viewer example shows how to add SVG viewing support to applications for great scalable UIs and graphics. [http://doc.qt.nokia.com/4.7-snapshot/painting-svgviewer.html Open] | | '''Example: SVG viewer''' SVG Viewer example shows how to add SVG viewing support to applications for great scalable UIs and graphics. [http://doc.qt.nokia.com/4.7-snapshot/painting-svgviewer.html Open] | ||
| Line 251: | Line 256: | ||
| '''Example: State toggle''' Two-way button example shows how to use State Machine Framework to implement a logic that toggles state when a button is clicked [http://doc.qt.nokia.com/4.7-snapshot/statemachine-twowaybutton.html Open] | | '''Example: State toggle''' Two-way button example shows how to use State Machine Framework to implement a logic that toggles state when a button is clicked [http://doc.qt.nokia.com/4.7-snapshot/statemachine-twowaybutton.html Open] | ||
|- | |- | ||
| − | | '''Example: State animations''' Move Blocks | + | | '''Example: State animations''' Move Blocks example shows how to animate items in a QGraphicsScene using State Machine Framework with a custom transition. [http://doc.qt.nokia.com/4.7-snapshot/animation-moveblocks.html Open] |
|- | |- | ||
| '''Example: State animations''' Application Chooser example shows how to use the Qt state machine and the animation framework. [http://doc.qt.nokia.com/4.7-snapshot/animation-appchooser.html Open] | | '''Example: State animations''' Application Chooser example shows how to use the Qt state machine and the animation framework. [http://doc.qt.nokia.com/4.7-snapshot/animation-appchooser.html Open] | ||
| Line 269: | Line 274: | ||
| '''Example: Custom completer''' Custom Completer is an other example of how to provide string-completion facilities for an input widget[http://doc.qt.nokia.com/4.7-snapshot/tools-customcompleter.html Open] | | '''Example: Custom completer''' Custom Completer is an other example of how to provide string-completion facilities for an input widget[http://doc.qt.nokia.com/4.7-snapshot/tools-customcompleter.html Open] | ||
|- | |- | ||
| − | | '''Example: Google suggest''' Google Suggest | + | | '''Example: Google suggest''' Google Suggest example demonstrates how to use the QNetworkAccessManager class to obtain a list of suggestions from the Google search engine as the user types into a QLineEdit [http://doc.qt.nokia.com/4.7-snapshot/network-googlesuggest.html Open] |
|- | |- | ||
| '''Example: HTTP Client''' Qt provides network-transparent features for many media and content classes, but HTTP interaction is still the very basic of modern development. HTTP example demonstrates a how to fetch files specified by URLs from remote hosts [http://doc.qt.nokia.com/4.7-snapshot/network-http.html Open] | | '''Example: HTTP Client''' Qt provides network-transparent features for many media and content classes, but HTTP interaction is still the very basic of modern development. HTTP example demonstrates a how to fetch files specified by URLs from remote hosts [http://doc.qt.nokia.com/4.7-snapshot/network-http.html Open] | ||
| Line 287: | Line 292: | ||
| '''QML GridView''' The GridView element allows displaying model data in a grid layout [http://doc.qt.nokia.com/latest/qml-gridview.html Read more] | | '''QML GridView''' The GridView element allows displaying model data in a grid layout [http://doc.qt.nokia.com/latest/qml-gridview.html Read more] | ||
|- | |- | ||
| − | | '''Example: Sorting''' Custom Sort/Filter Model | + | | '''Example: Sorting''' Custom Sort/Filter Model example illustrates how to perform advanced sorting and filtering in Qt [http://doc.qt.nokia.com/4.7-snapshot/itemviews-customsortfiltermodel.html Open] |
|- | |- | ||
| − | | '''Example: Localization''' Qt makes | + | | '''Example: Localization''' Qt makes localization easy. Internationalization (I18N) example demonstrates Qt's support for translated text [http://doc.qt.nokia.com/4.7-snapshot/tools-i18n.html Open] |
|- | |- | ||
| '''Example: Regexps''' Regular Expressions (RegExp) example shows how regular expressions in Qt are used with strings [http://doc.qt.nokia.com/4.7-snapshot/tools-regexp.html Open] | | '''Example: Regexps''' Regular Expressions (RegExp) example shows how regular expressions in Qt are used with strings [http://doc.qt.nokia.com/4.7-snapshot/tools-regexp.html Open] | ||
| Line 333: | Line 338: | ||
| '''Example: Drag'n'drop icons''' Drag'n'drop is the basic feature in modern user interfaces. Draggable Icons example shows how to drag and drop image data between widgets in Standard view [http://doc.qt.nokia.com/4.7-snapshot/draganddrop-draggableicons.html Open] | | '''Example: Drag'n'drop icons''' Drag'n'drop is the basic feature in modern user interfaces. Draggable Icons example shows how to drag and drop image data between widgets in Standard view [http://doc.qt.nokia.com/4.7-snapshot/draganddrop-draggableicons.html Open] | ||
|- | |- | ||
| − | | '''Example: Drag'n'drop text''' Draggable Text | + | | '''Example: Drag'n'drop text''' Draggable Text example shows how to drag and drop textual data between widgets in Standard view [http://doc.qt.nokia.com/4.7-snapshot/draganddrop-draggabletext.html Open] |
|- | |- | ||
| − | | '''Feature: Drag'n'drop''' Graphics View | + | | '''Feature: Drag'n'drop''' Graphics View framework provides drag and drop support for the scene, and for each and every item [http://doc.qt.nokia.com/4.7-snapshot/graphicsview.html#drag-and-drop Read more] |
|- | |- | ||
| − | | '''Example: Fetch more''' Fetch More | + | | '''Example: Fetch more''' Fetch More example shows how two add items to an item view model on demand, commonly used by applications with a list view [http://doc.qt.nokia.com/4.7-snapshot/itemviews-fetchmore.html Open] |
|- | |- | ||
| '''Example: FTP Client''' FTP Client example demonstrates how Qt can be used to list the available files on an FTP server and download them. [http://doc.qt.nokia.com/4.7-snapshot/network-qftp.html Open] | | '''Example: FTP Client''' FTP Client example demonstrates how Qt can be used to list the available files on an FTP server and download them. [http://doc.qt.nokia.com/4.7-snapshot/network-qftp.html Open] | ||
| Line 355: | Line 360: | ||
| '''Example: Undo framework''' Undo Framework example shows how to easily implement advanced undo/redo functionality with the Qt undo framework [http://doc.qt.nokia.com/4.7-snapshot/tools-undoframework.html Open] | | '''Example: Undo framework''' Undo Framework example shows how to easily implement advanced undo/redo functionality with the Qt undo framework [http://doc.qt.nokia.com/4.7-snapshot/tools-undoframework.html Open] | ||
|- | |- | ||
| − | | '''Feature: QtScript''' QtScript module | + | | '''Feature: QtScript''' QtScript module provides classes for making Qt applications scriptable. [http://doc.qt.nokia.com/4.7-snapshot/qtscript.html Read more] |
|- | |- | ||
| '''Example: Qt scripting''' Qt Scripting example demonstrates how to implement the functionality of a calculator widget [http://doc.qt.nokia.com/4.7-snapshot/script-calculator.html Open] | | '''Example: Qt scripting''' Qt Scripting example demonstrates how to implement the functionality of a calculator widget [http://doc.qt.nokia.com/4.7-snapshot/script-calculator.html Open] | ||
| Line 371: | Line 376: | ||
| '''Class: Grid layout''' QGraphicsGridLayout class provides a grid layout for managing widgets in Graphics View [http://doc.qt.nokia.com/4.7-snapshot/qgraphicsgridlayout.html Read more] | | '''Class: Grid layout''' QGraphicsGridLayout class provides a grid layout for managing widgets in Graphics View [http://doc.qt.nokia.com/4.7-snapshot/qgraphicsgridlayout.html Read more] | ||
|- | |- | ||
| − | | '''Feature: Painter rotate''' Adjusting | + | | '''Feature: Painter rotate''' Adjusting coordinate system on-the-fly makes drawing of custom layouts easier in some cases. QPainter's rotate functionality rotates the coordinate system the given angle clockwise. [http://doc.qt.nokia.com/4.7-snapshot/qpainter.html#rotate ] |
|} | |} | ||
|} | |} | ||
Revision as of 09:00, 12 July 2011
This article introduces some fundamental use cases that developers porting applications from iPhone and Android will need to implement, and discusses sample solutions. In general, Qt provides all modern classes and functionalities familiar from iPhone and Android. This makes it easy to keep the application logic close to the original when porting (see Snapshot of Qt classes).
Contents |
Using Internet Services
Mobile applications are extremely likely to use the Internet — whether loading news stories from a server, using a remote service API such as Facebook or Twitter, or uploading photos to a photo-sharing service.
While protocols and service APIs vary considerably, it is very typical that the traffic happens on top of the HTTP protocol and is described as XML or JSON content.
The QNetworkAccessManager class[1] makes it easy to interact with remote services. The class handles common configuration and settings for the requests it sends, such as settings for proxies and caching. The API is asynchronous and uses signals to notify clients about events such as finished requests. QNetworkAccessManager supports HTTP(S) and FTP.
A simple example of retrieving data using an URL asynchronously: (replyFinished() slot is called upon completion)
...
QUrl url("http://www.example.com/example.xml");
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(url);
...
myClass::replyFinished(QNetworkReply *reply) {
QByteArray replyData(reply->readAll());
// Process the reply data
}
See more info at http://doc.trolltech.com/main-snapshot/qnetworkaccessmanager.html
Web View
Qt has a WebView[2] QML element for displaying web content inside the application, like iPhone and Android. Thus, your existing server-side web content is directly reusable in Qt platforms.
Here is a short example of how to use a WebView element. A website can be loaded into the element by setting its url[3] property. Note that the QtWebKit import is also required.
import QtQuick 1.0
import QtWebKit 1.0
WebView {
height: 640
width: 480
url: "http://www.developer.nokia.com/"
}
To get a scrolling webview, put the WebView element inside a Flickable[4] element:
import QtQuick 1.0
import QtWebKit 1.0
Flickable {
id: flick
width: 640
height: 480
contentWidth: web.width
contentHeight: web.height
WebView {
id: web
anchors.top: parent.top
anchors.left: parent.left
preferredWidth: flick.width
preferredHeight: flick.height
url: "http://www.developer.nokia.com"
}
}
There are a few notable things about the above example: first, the WebView gets its preferredWidth and preferredHeight properties set to the size of the Flickable, which helps the WebView to try to resize the page in an intelligent way. Second, the Flickable needs to know the size of its contents to enable flicking: this is done using the contentWidth and contentHeight properties. Third, as the actual size of the WebView changes according to the loaded page, the WebView is anchored in the Flickable only by its top and left edges.
OpenGL ES Graphics using Qt GameEnabler
It is easy to integrate OpenGL ES graphics into Qt applications using Qt's OpenGL module. Qt GameEnabler takes the integration one step further by providing a simple starting point for game development, including not only graphics, but also audio playback and input event handling. By downloading a Qt GameEnabler release you get a project template that you can then start customizing and extending.
For a step-by-step introduction to Qt Game Enabler, see How to utilise OpenGL ES 2.0 on Symbian^3 and Maemo#Native OpenGL with Qt application framework using Qt GameEnabler this guide.
Media Usage
Many application ideas and concepts can be realised thanks to the ease and convenience of the audio/video capabilities of Qt.
Qt provides a quick and simple way to display images and simple animations using the Image and AnimatedImage class:
AnimatedImage {
source: "animations/fire.gif"
}
Also, the common task of playing an audio file can be easily accomplished:
QSound::play("mysounds/bells.wav");
For more complex cases, Qt provides the [http://doc.trolltech.com/4.7-snapshot/phonon.html Phonon multimedia framework]. Phonon provides functionality for playback of the most common multimedia formats. The media can be read from files or streamed over a network, using a QURL to a file.
Music file playback can be constructed as follows:
Phonon::MediaObject *music =
Phonon::createPlayer(Phonon::MusicCategory,
Phonon::MediaSource("/path/song.mp3"));
music->play();
For video playback, the QtMultimediaKit module[5] provides the Video QML element[6].
import QtQuick 1.0
import QtMultimediaKit 1.1
Rectangle {
width: 360
height: 360
Video {
source: "movie.avi"
anchors.fill: parent
}
}
Application Data Storage
SQLite has changed the way you store and read data easily in mobile applications, and there's no reason to change it. Qt allows the application to use either the device's own SQLite database or include one inside Qt project.
In addition to features that are familiar from iPhone and Android, Qt also provides an offline storage API. With the offline storage API, you can use SQLite directly from QML code with an intuitive JavaScript interface.
Qt provides several different methods for storing data.
Simple data, such as application settings, is easily handled with QSettings [7]. All details are handled automatically:
QSettings settings("CompanyName", "ApplicationName");
settings.setValue("store/price", 13);
...
int price = settings.value("store/price").toInt();
More complex data can be serialized into a binary form using QDataStream [8]. Serialization of C++'s basic data types, such as char, short, int and char*, is automatic. Serialization of more complex data is accomplished by breaking up the data into these primitive units. An XML format for data storage is available with QtXml [9], which provides a stream reader and writer for XML documents, and C++ implementations of SAX and DOM.
The most powerful data storage method is QtSql [10], which provides full SQL database functionalities. The following snippet creates a to-do list into a local database, inserts some data there, and reads it back selectively.
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("myDataBase");
QSqlQuery query;
query.exec("CREATE TABLE items (id int primary key, item TEXT, description TEXT)");
query.exec("INSERT INTO items values(101, 'Shopping list', 'Milk')");
query.exec("INSERT INTO items values(102, 'Shopping list', 'Beer')");
query.exec("SELECT * FROM items WHERE description='Beer'");
while (query.next()) {
QString list = query.value(1).toString();
QString item = query.value(2).toString();
qDebug() << list;
qDebug() << item;
}
A temporary memory based database can be used by setting ':memory:' as the database name.
Useful features for porting
This section covers some of the most common features and examples for porting cases, grouped by typical applications. Application sketches on the left side of this document illustrate common application types on iPhone and Android devices. UI component images on the right show some of the most common Maemo/Nokia N900 elements used for building native-like user experiences.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The sketches were created with [Balsamiq Mockups].
- See also Nokia Developer Design and User Experience Guide for ideas on how to achieve the best possible user experience when porting your application for Nokia devices.











