Symbian programming

tearfuloilMobile - Wireless

Dec 10, 2013 (3 years and 8 months ago)

67 views

LAMAD

Symbian Qt

17.3.2013

Symbian OS

Symbian OS

One of the first modern mobile
operating systems

Most popular smartphone OS

until the end of 2010

Main Nokia OS until 2011

Maintained by Accenture

Nokia 808 PureView is the

last ever Symbian smartphone

Symbian OS

+ True multi
-
tasking operating system

+ Wide range of available phones (from cheap
keypad
-
based to large touchscreen smartphones)

+ Still has a big user base, especially in developing
countries

-

More suited for non
-
touch keypad devices

-

Slow and outdated

-

Declining user base


Initial partners of Symbian OS

S60 3
rd

edition

For keypad
-
only devices

Nokia E72

Nokia C5

Nokia N95

Nokia E52

S60 5
th

edition

Touch and touch&type devices

Nokia N97

Nokia C5
-
03

Nokia E5

Nokia 5800

Symbian^3

For touchscreen devices

Multiple home screens

Better hardware

Nokia C7

Nokia E7

Nokia N8

Nokia 808

Market share 2012

Smartphones

4Q ’11

4Q ’12



4Q ’11

4Q ’12

(mil. phones)

Sales

Sales

Growth

Share

Share

Android

77.1

144.7

88%

51%

70%

iOS

35.5

43.5

23%

24%

21%

Blackberry

13.2

7.3

(44)%

9%

4%

Microsoft

2.8

6.2

124%

2%

3%

Bada

3.1

2.7

(14)%

2%

1%

Symbian

17.5

2.6

(85
)%

12%

1%

Others

1.2

0.7

(39)%

1%

0%

Total

150.2

207.7

38%

100%

100%

Developing for Symbian

3 options available

Java ME

+ Easy memory management

+ Easy to develop

+ Application can be ported to S40 Asha
(Nokia’s feature
-
phone OS)

-

Lack of APIs(maps, navigation, UI controls)

-

Limited access to hardware

-

Needs certification and signing

-

Limited subset of Java

Symbian C++

Subset of C++

+ Full access to hardware

+ Low memory footprint

+ Good profiling and debugging tools

-

Lack of APIs (maps, navigation, UI controls)

-

Steep learning curve

-

Difficult memory management

-

Needs certification and signing

Qt Framework

+ Good set of UI controls

+ Good customization options

+ Fast to develop

+ Application can be deployed for
MeeGo

with
minor changes

-

Large memory footprint on older
Symbian

versions

-

Lack of
Symbian

emulator (although Qt
Simulator can simulate Qt on
Symbian
)

-

The Mobility package can have some bugs

Qt


Introduction

What is Qt?

C++ framework


bindings for other
languages Python, Ruby, C#, etc.


Originally for user interfaces


now for:

Databases, XML,
WebKit
, multimedia,
networking, OpenGL, scripting, location,
telephony, non
-
GUI...

“Qt is a cross platform development

framework written in C++.”

Desktop target platforms


Windows





Mac OS X




Linux/Unix X11

Mobile target platforms


Windows CE



Symbian



Maemo/MeeGo



Embedded Linux

What is Qt?

Qt is made up of modules

All modules have a common scheme and
are built from the same API design ideas

QtCore

Phonon

QtXmlPatterns

QtXml

QtWebKit

QtSvg

QtSql

QtScript

QtOpenVG

QtOpenGL

QtNetwork

QtMultimedia

QtGui

QtMobility

What is Qt?

Qt extends C++ with macros and introspection







All Qt object inherit QObject base class

All code is still plain C++

//

foreach macro

foreach

(
int

value,

intList
)

{



}


//

QObject is the base class of Qt

QObject

*o

=

new

QPushButton;

o
-
>
metaObject
()
-
>
className
();

//

returns

”QPushButton”


//

Event handling with signal and solts

connect
(
button
,

SIGNAL
(
clicked
()),

window
,

SLOT
(
close
()));

Getting Qt


Easiest way to get started is to download Qt SDK.

It contains:


Qt headers and documentation


Pre
-
built Qt libraries and tools


The QtCreator integrated development
environment

Windows Installation

1.
Download the Qt SDK for Windows



2.
Run the downloaded installer



3.
Click through the installer




4.
Start QtCreator from the start menu

Hello World

#include

<QApplication>

#include

<Qlabel>

int

main
(

int

argc,

char

**argv

)

{



QApplication

app(

argc,

argv

);



QLabel

l(

"Hello

World!"

);



l.
show
();



return

app.
exec
();


}


Windows

Linux

Mac

Symbian

Qt


QObject

The QObject

QObject

is

the

base

class

of

almost

all

Qt

classes

and

all

widgets


It

contains

many

of

the

mechanisms

of

Qt
:


events


signals

and

slots


properties


memory

management

The QObject

QObject

is the base class to most Qt classes.


Examples of exceptions are:


Classes that need to be lightweight such as graphical
primitives


Data containers (
QString
,
QList
,
QChar
, etc)


Classes that needs to be copyable, as
QObject
s cannot
be copied

Meta data

Qt implements introspection in C++

Every
QObject

has a
meta object

The meta object knows about:


class name (
QObject::className
)


inheritance (
QObject::inherits
)


properties


signals and slots


general information (
QObject::classInfo
)

How meta data is generated?

class

LocationHandler

:

public

QObject

{


Q_OBJECT


Q_CLASSINFO
(
"author"
,

"Mopsi"
)


Q_PROPERTY
(
QGeoPositionInfo

location READ

location WRITE

setInitialLocation
)


public
:



LocationHandler
(
const

int

&
desiredAccuracy
,

QObject

*
parent
=
0
);


QGeoPositionInfo

location
()
const
;


public

slots
:


void

setInitialLocation
(

const

QGeoPositionInfo

&a
Location

);


signals
:


void

locationChanged
(
QGeoPositionInfo

);



private
:



QGeoPositionInfo

m_location
;

};

Meta data

Qt keywords

General info

about the
class

The
Q_OBJECT

macro,
usually first

QObject must be inherited first

(could be indirect)

Getter, const, returns value,

takes no arguments

class

LocationHandler

:

public

QObject

{


Q_OBJECT


Q_CLASSINFO("author", "
Mopsi
")


Q_PROPERTY
(
QGeoPositionInfo

location

READ

location

WRITE

setInitialLocation
)


public
:



LocationHandler
(const
int

&
desiredAccuracy
,
QObject

*parent=0);


QGeoPositionInfo

location
()
const
;


public

slots
:


void

setInitialLocation
(

const

QGeoPositionInfo

&
a
Location

);


signals:


void
locationChanged
(
QGeoPositionInfo

);


private
:



QGeoPositionInfo

m_location
;

};

QObject

has
properties

with
getter

and
setter

methods

Naming policy:
color
,
setColor

For booleans:
isEnabled
,
setEnabled

QObject properties

Setter, returns
void,

takes value as

only argument

Macro with
property
declaration

Private state

Direct access




Through the meta info and property system



Discover properties at run
-
time

Using properties

QString

text

=

label
-
>
text
();

label
-
>
setText
(
"Hello

World!"
);

QString

text

=

object
-
>
property
(
"text"
).
toString
();


object
-
>
setProperty
(
"text"
,

"Hello

World"
);

int

QMetaObject
::
propertyCount
();


QMetaProperty

QMetaObject
::
property
(
i
);


QMetaProperty
::
name
/
isConstant
/
isDesignable
/
read
/
write
/...

Memory Management

QObject

can have parent and children

When a parent object is deleted, it deletes its children

This is used when implementing visual hierarchies.

QDialog

*parent

=

new

QDialog
();

QGroupBox

*box

=

new

QGroupBox
(parent);

QPushButton

*button

=

new

QPushButton
(parent);

QRadioButton

*option1

=

new

QRadioButton
(box);

QRadioButton

*option2

=

new

QRadioButton
(box);


delete

parent;

parent

box

button

option1

option2

parent

deletes
box

and
button

box

deletes
option1

and
option2

Qt


Signals and slots

Signals and Slots

Is

the

default

event

handling

mechanism

in

Qt


Dynamically

and

loosely

ties

together

events

and

state

changes

with

reactions


It’s

what

makes

Qt

tick

//

Event handling with signal and solts

connect
(
button
,

SIGNAL
(
clicked
()),

window
,

SLOT
(
close
()));

Signals and Slots in Action

emit

clicked();

Signals and Slots in Action

connect
(trackingButton,
SIG
NAL
(
clicked
()),

this,
SLOT
(
showTrackingScreen
())
);24


private slots
:


void

showTrackingScreen
();

Signals and Slots vs Callbacks

A
callback

is a pointer to a function that is
called when an event occurs, any function
can be assigned to a callback


No type
-
safety


Always works as a direct call

Signals

and
Slots

are more dynamic


A more generic mechanism


Easier to interconnect two existing classes


Less knowledge shared between involved
classes

Qt


User interface

Qt Widgets

User interfaces are built from individual widgets





46 widgets in Designer

59+ direct descendants from QWidget

QLabel

QPushButton

QLineEdit

QDoubleSpinBox

QScrollBar

Qt Quick

Qt Quick is the alternative to Qt Widgets

Qt Quick consists of


QML


the language (similar to JavaScript)


Designed for building device user interfaces


Can be used in other application too


Qt Declarative


the Qt module


Contains the QML engine, context and view


Qt bindings for QML


Mechanisms for integrating C++ and QML

There is tooling support in Qt Creator

Qt Quick supported
ONLY

in Symbian^3 and desktop

Traits of a Widget

Occupies a rectangular area of the screen

Receives events from input devices

Emits signals for “notable” changes


Are structured in a hierarchy

Can contain other widgets

Cross Platform Styles

Widgets

are

drawn

using

a

platform

specific

style

to

ensure

a

native

look

Using Designer

drag
-
and
-
drop

Using the Code

#ifndef
MOPSIMAINSCREEN_H

#define
MOPSIMAINSCREEN_H


#include
<QWidget>


namespace

Ui

{


class

MopsiMainScreen
;

}


class

MopsMainScreen
:
public

QWidget

{


Q_OBJECT

public
:


MopsiMainScreen(
QWidget
*parent=0);


~MopsiMainScreen ();


private
:


Ui
::
MopsiMainScreen

*ui;

};


#endif
// MOPSIMAINSCREEN_H


Forward declaration of the

Ui::MopsiMainScreen


class

A
Ui::Widget

pointer,

ui
, refers to all widgets

Basically a
standard
QWidget

derived class

#include “mopsimainscreen.h"

#include "ui_widget.h"


MopsiMainScreen
::
MopsiMainScreen

(
QWidget

*parent) :


QWidget
(parent),


ui
(
new

Ui
::

MopsiMainScreen
)

{


ui
-
>setupUi(this);

}


MopsiMainScreen
::~MopsiMainScreen()

{


delete

ui
;

}

Using the Code

Instanciates the

Ui::MopsiMainScreen

class as
ui

Deletes the
ui

object

Calls
setupUi
,
creating all the
widgets as children
to the given parent
(
this
).

Style sheets

For highlighting and cross platform styling, all
QWidget

classes
have a
styleSheet

property

To style an entire application:
QApplication::setStyleSheet

Style sheets are inspired from CSS

QToolButton

{


background
-
color
: blue;


color
: white;


text
-
align
: center;


font
-
size
: 14pt;


}

No stylesheet

Style sheets

The easiest way to apply a style
sheet to an individual widget is to
use Designer

Qt


Internet

Accessing internet

QtWebKit classes uses the QNetworkAccessManager

Provides access to web:


Independent of UI


Handle requests and replies


Cache web pages


Keep track of cookies


Use proxies


Act as a protocol translator

networkAccessManager

=

new

QNetworkAccessManager
(
this
);

connect
(
networkAccessManager
,



SIGNAL
(
finished
(
QNetworkReply
*)),



this
,



SLOT
(
parseResponse
(
QNetworkReply
*)));

Classes for Network
Access

QNetworkReply

QNetworkRequest

QAbstractNetworkCache

QNetworkCookieJar

QNetworkProxyFactory

QNetworkAccessManager

Accessing HTTP
programatically

Example


download a file via HTTP using
QNetworkAccessManager

QNetworkAccessManager

*
manager

=

new

QNetworkAccessManager
(
this
);


connect
(
manager
,

SIGNAL
(
finished
(
QNetworkReply
*)),

this
,



SLOT
(
downloadDone
(
QNetworkReply
*)));


manager
-
>
get
(
QNetworkRequest
(
QUrl
(
"http://cs.uef.fi/mopsi/photos/use
r.png"
)));


InternetUtil
::
downloadDone
(
QNetworkReply

*reply)

{


QImageReader

reader(reply,

"png"
);


mImage

=

reader.
read
());



emit

iconDownloaded
(
mImage
);


reply
-
>
deleteLater
();


}

Qt


Location

Location

27

Location Example

// create positioning source

source

=
QGeoPositionInfoSource
::
createDefaultSource(
this
);


// Set to listen just to GPS

source
-
>
setPreferredPositioningMethods

(
QGeoPositionInfoSource
::
SatellitePositioni
ngMethods
);


source
-
>setUpdateInterval(
1000
);
// Update
interval is 1s



// Connect source signal to a method that
handles the update

connect(
source
,
SIGNAL
(
positionUpdated
(
QGeoPositionInfo
)),

MapWindow
::instance()
,

SLOT
(
positionUpdated
(
QGeoPositionInfo
)));

...

void

MapWindow
::positionUpdated(
const

QGeoPositionInfo
& info)
{


// handle here the position change