Sei sulla pagina 1di 24

Qt on Symbian

The Anatomy of an App

John Kern
Member of Technical Staff
Symbian Foundation
A brief history of Symbian

Founded back in 1980s


Renamed Symbian Ltd in 2001
June 2008 - Nokia bought Symbian Ltd
April 2009 - Symbian Foundation Formed
October 2009 - Kernel EPL'ed
February 2010 - Source Code completely EPL'ed
The Symbian Foundation

The People
Technology Management
Release and deployment
Marketing
Governance
Resources - http://developer.symbian.org
source
documentation
Symbian OS - state of the art

kernel
real time
multithreading
SMP-ready kernel
security
server architecture
http://developer.symbian.org/wiki/index.php/Symbian_OS_Internals
Qt Evolution

Symbian^1 same as S60 5th Edition


Symbian^2 and earlier - S60
Symbian^3 - Qt for S60
Smart installer - back to 3rd ed - FP1
Symbian^4 - UI (Orbit)
Qt UI Extensions for Mobile
APIs for phone specific functionality
Mobile Extensions
Qt Mobility project
Runtimes

Qt
Web runtime
Flash
python
J2ME
Good time to develop for Symbian
Pain points go away.
Custom widgets
Learning curve
Focus on innovation, not infrastructure
Pain Points?

Qt
descriptors => QString
TRAP/Leave => C++ exceptions
Active Object => signals/slot
sqlite3
webkit
Open C - provides a posix layer.
Example - Hello World

menu bar
list widget
menu item on Options
double click on list item.
Signals/Slots

Decouples action from behavior


It is async
We will be using it UI but also applies to networking.
Menu Bar

verAction = new QAction(tr("&Version"),this);


menuBar()->addAction(verAction);
connect(verAction, SIGNAL(triggered()),
this, SLOT(displayVersion()));
List Behavior

list of birds
Double click?
List

birds << "Avocet" << "Sparrow" << "Crow" << "Sea gull" << "Kookaburra";
birdList = new QListWidget;
setCentralWidget(birdList);
birdList->addItems(birds);
connect(birdList, SIGNAL(itemDoubleClicked ( QListWidgetItem * )),
this, SLOT(displayBird(QListWidgetItem *)));

void MainWindow::displayBird ( QListWidgetItem * item )


{
QMessageBox::information(this,"picked", item->text());
}
Simple UI - main()

int main(int argc, char *argv[])


{
QApplication a(argc, argv);
MainWindow w;
w.createMenus();
w.setWindowTitle("Hello World!");
w.showMaximized();
return a.exec();
}
Example - Seafood

The Model-View pattern


decouples data from UI.
Fishes encapsulates
uses SQLite3
widgets
QStackedWidget
QTabWidget
QWebView
QTableView
QStackedWidget

Stacks widgets on top of each other


Only one visible at a time.
Ours will contain
QTabWidget
QWebView
QTableWidget
Tab Widget

three lists
best
ok
worst
Tab Widget - construct

// Tab Widget - owns a list of QListWidget


this->tabWidget = new QTabWidget;

//best choice
this->bestList = new QListWidget;
this->bestList->addItems(this->fishDb->getBest());
this->tabWidget->addTab(this->bestList, "best");
// ... omitted ok and worst lists.
QWebView
html
drive by SQLite
SQLite - connecting to the DB

QSqlDatabase db;

// Find SQLite driver


db = QSqlDatabase::addDatabase("QSQLITE");

QString dbFile=QDesktopServices::storageLocation(QDesktopServices::DataLocation)
+ '/' // Qt Universal file separator
+ "seafood.db";
dbFile.replace("/","\\");

QFile f(dbFile);

db.setDatabaseName(dbFile);

// Open databasee
if(!db.open())
SQLite - query
QString detailsInHtml;
QSqlQuery query;

query.prepare("select details from ecoDetails "


"where fid in (select fid from fish where name = :name )");
query.bindValue(":name",name);

if (!query.exec()) {
QString errCode = "failed to get eco details " + query.lastError().text();
qWarning(errCode.toStdString().c_str());
} else {
detailsInHtml.append("<html> <title>name</title> <body> <h2>Eco Details</h2> <ul> ");
while (query.next()){
detailsInHtml.append( " <li>");
detailsInHtml.append( query.value(0).toString());
detailsInHtml.append( "</li> " );
}
detailsInHtml.append("</ul> </body> </html> ");
...
QTableView

Works well with Model/View


Here
UI designer
one SQL query
QTable

newItem = new QTableWidgetItem(nutrition[Fishes::ECalories] );


this->ui->tableWidget->setItem(row++,COLUMN, newItem);

newItem = new QTableWidgetItem(nutrition[Fishes::ETotalFat] );


this->ui->tableWidget->setItem(row++,COLUMN, newItem);

newItem = new QTableWidgetItem(nutrition[Fishes::ETotalProtein] );


this->ui->tableWidget->setItem(row++,COLUMN, newItem);

....
Where to go from here?

Download Qt Creator
http://qt.nokia.com/

Potrebbero piacerti anche