Symbian programming

advertisement
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 3rd edition
For keypad-only devices
Nokia C5
Nokia E72
Nokia N95
Nokia E52
S60 5th 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 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?
“Qt is a cross platform development
framework written in C++.”
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...
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
QtGui
QtMobility
QtOpenGL
QtWebKit QtNetwork
QtXml
Phonon
QtXmlPatterns
QtMultimedia
QtOpenVG
QtSql
QtSvg
QtScript
What is Qt?
Qt extends C++ with macros and introspection
// 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()));
All Qt object inherit QObject base class
All code is still plain C++
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
Windows
Linux
Mac
#include <QApplication>
#include <Qlabel>
int main( int argc, char **argv ) {
QApplication app( argc, argv );
QLabel l( "Hello World!" );
l.show();
return app.exec();
}
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 QObjects 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)
Meta data
How meta data is generated?
The
Q_OBJECT
macro,
usually first
QObject must be inherited first
(could be indirect)
General info
class LocationHandler : public QObject {
about the
Q_OBJECT
class
Q_CLASSINFO("author", "Mopsi")
Q_PROPERTY(QGeoPositionInfo location READ location WRITE setInitialLocation)
public:
LocationHandler(const int &desiredAccuracy, QObject *parent=0);
QGeoPositionInfo location() const;
Qt keywords
public slots:
void setInitialLocation( const QGeoPositionInfo &aLocation );
signals:
void locationChanged(QGeoPositionInfo );
private:
QGeoPositionInfo m_location;
};
QObject properties
QObject has properties with getter and setter methods
Naming policy: color, setColor
For booleans: isEnabled, setEnabled
Macro with
property
declaration
class LocationHandler : public QObject {
Q_OBJECT
Q_CLASSINFO("author", "Mopsi")
Q_PROPERTY(QGeoPositionInfo location READ location WRITE
setInitialLocation)
Getter, const, returns value,
takes no arguments
public:
LocationHandler(const int &desiredAccuracy, QObject *parent=0);
QGeoPositionInfo location() const;
Setter, returns
public slots:
void,
void setInitialLocation( const QGeoPositionInfo &aLocation );
takes value as
only argument signals:
void locationChanged(QGeoPositionInfo );
private:
QGeoPositionInfo m_location;
};
Private state
Using properties
Direct access
QString text = label->text();
label->setText("Hello World!");
Through the meta info and property system
QString text = object->property("text").toString();
object->setProperty("text", "Hello World");
Discover properties at run-time
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
parent deletes box and button
box deletes option1 and option2
box
option1
button
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,SIGNAL(cli
cked()), 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
QLabel
QScrollBar
QLineEdit
QPushButton
QDoubleSpinBox
46 widgets in Designer
59+ direct descendants from QWidget
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>
Forward declaration of the
Ui::MopsiMainScreen
class
namespace Ui {
class MopsiMainScreen;
}
class MopsMainScreen: public QWidget {
Q_OBJECT
public:
MopsiMainScreen(QWidget *parent=0);
~MopsiMainScreen ();
A Ui::Widget pointer,
ui, refers to all widgets
private:
Ui::MopsiMainScreen *ui;
};
#endif // MOPSIMAINSCREEN_H
Basically a
standard QWidget
derived class
Using the Code
#include “mopsimainscreen.h"
#include "ui_widget.h"
MopsiMainScreen::MopsiMainScreen
(QWidget *parent) :
QWidget(parent),
ui(new Ui:: MopsiMainScreen)
{
ui->setupUi(this);
}
Calls setupUi,
creating all the
widgets as children
to the given parent
(this). MopsiMainScreen::~MopsiMainScreen()
{
delete ui;
}
Instanciates the
Ui::MopsiMainScreen
class as ui
Deletes the ui
object
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
No stylesheet
QToolButton {
background-color: blue;
color: white;
text-align: center;
font-size: 14pt;
}
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
QNetworkRequest
QNetworkReply
QNetworkAccessManager
QNetworkProxyFactory
QAbstractNetworkCache
QNetworkCookieJar
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/user.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::SatellitePositioningMethods);
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
Download