wtorek, 3 sierpnia 2010

Szablon aplikacji Qt Quick na Symbiana

Tak jak wcześniej zauwazyłem, nie można uruchamiać aplikacji Qt Quick w sposób skryptowy. Co oznacza że dla Symbiana trzeba napisać szablon dzięki któremu będzie można testować działanie kodu Qt Quick w QML.

Tworzymy folder Szablon ( u mnie to jest na wirtualnym Windows XP w Windows 7 pod c:\Projekty\Szablon). Tworzymy plik projektu main.pro

# jakich bibliotek Qt chce się uzyć
QT       += core gui declarative
# nazwa aplikacji 
TARGET = Szablon
# informujemy że tworzymy aplikację Qt na Symbiana
TEMPLATE = app
# pliki żródlowe 
SOURCES += main.cpp
# pliki nagłowkowe
HEADERS  +=
# pliki designera Qt
FORMS    +=
# inne pliki używane w Qt (szczególnie pliki QML)
OTHER_FILES = main.qml
# plik zasobów zawierajacy pliki QML
RESOURCES = main.qrc 
# informacje które są potrzebne dla kompilatora dla Symbiana
symbian {
# plik ikonki programu 
ICON = icon.svg
# biblioteki potrzebne do zablokowania położenia aplikacji w orientacji poziomej
LIBS += -lcone -leikcore -lavkon
}
Tworzymy plik zasobów main.qrc
<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>

Zrobimy plik main.qml z kodem QML

import Qt 4.7
 
Rectangle {
    anchors.fill: parent; color: "black"
 
    Rectangle {
        anchors.centerIn: parent
        width: 100; height: 40; radius: 5; color: "lightgray"
 
        Text { anchors.centerIn: parent; text: "Koniec"; color: "black" }
 
        MouseArea {
            anchors.fill: parent
            onClicked: Qt.quit()
        }
    }
} 

Na koniec pozostał kod wykonywalny z main.cpp

#include <QtGui/QApplication>
#include <QDeclarativeView>
#include <QDeclarativeContext>
#include <QDeclarativeEngine>
#include <QGraphicsObject>

// biblioteki potrzebne do zablokowania zmiany orientacji
#ifdef Q_WS_S60
    #include <eikenv.h>
    #include <eikappui.h>
    #include <aknenv.h>
    #include <aknappui.h>
#endif

// funkcja main uruchamiająca aplikację
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
   // kod AVKON blokujący orientację 
#ifdef Q_WS_S60
 CAknAppUi* appUi = dynamic_cast<CAknAppUi*> (CEikonEnv::Static()->AppUi());
    TRAP_IGNORE(
        if(appUi) {
               appUi->SetOrientationL(CAknAppUi::EAppUiOrientationLandscape);
        }
    );
#endif
    QDeclarativeView view;
// będzie nam to potrzebne jak zechcemy uzywać innych bibliotek importowanych takich jak
// moduły WebView czy Particles
   view.engine()->addImportPath("./imports");          
// pobieramy plik z zasobów
     view.setSource(QUrl("qrc:/main.qml"));
// ustawiamy tryb zmiany rozmiaru
    view.setResizeMode(QDeclarativeView::SizeRootObjectToView);

#if defined(Q_WS_S60)
// ustawiamy na sztywno obszar gdzie będzie rysowane 
    view.setGeometry(QRect(0,0,640,360));
// wykonujemy pełne wyświetlenie
    view.showFullScreen();
#endif
// aplikacja ma zostać uruchomiona
    return app.exec();
}

Do plików w tym folderze trzeba dodać jakaś ikonkę SVG 44x44 z programu inkspace i nazwać ją icon.svg

Pozostało więc popracować nad kompilacją Uruchomiłem Start -> Programy-> Qt for Symbian by Nokia v4.7.0-beta2 (S60) -> Qt for Symbian Command Prompt i wpisałem

cd c:\Projekty\Szablon

następnie zrobiłem pliki potrzebne do komplikacji wpisując

gmake

następnie robię kompilację pod emulatora

make debug-winscw

uruchamiam emulatora

make run

zamykam emulatora i sprzątam po emulatorze poleceniem

abld reallyclean winscw udeb

następnie ustawiam pod kompilację na komórkę

make release-gcce

po skompilowaniu trzeba zrobić paczkę

make sis QT_SIS_OPTIONS=-u

zrobiłem nie podpisaną paczkę i trzeba ją podpisać

signsis -s szablon.sis szablon.sisx c:\key\imobile.cer c:\key\imobile.key

Instalujemy to na komórce i na koniec pozostaje posprzątanie po kompilacji

abld reallyclean gcce urel

a może jednak lepiej będzie używać polecenia do czyszczenia wszystkiego (łącznie z paczkami)

make distclean

Na zakończenie przyszła mi myśl, że prawdziwego programistę można poznać po tym jak sprząta po sobie.

niedziela, 1 sierpnia 2010

Qt Quick na Symbianie

Za jedną z najciekawszych technologii uważam QtQuick. Jest to nowy język opisu interfejsu graficznego wzorowany na CSS 3. Składa się z biblioteki Declarative i z języka QML. Ale mnie najbardziej zastanawiało jak będzie można programować w tym pod Symbianem. Przeczuwałem że mogą być problemy z tego powodu że Qt Quick tak naprawdę nie potrzebuje kompilacji kodów, więc przypominało mi to sytuację z programowaniem na Pythona czy m-shell. Wystarczy skompilować program qmlviewer i prawie wszystkie programy Qt Quick uruchamiać przez niego. Ale pomyślałem że takie rozwiązanie to przeczy zasadom bezpieczeństwa w Symbiaznie. Zaintrygowany  postanowiłem sprawdzić jak to rozwiązano.

Ściągnąłem Qt 4.7 beta 2 na Symbiana i zainstalowałem to na wirtualnym Windows XP.pod taką ścieżką C:\Qt\4.7.0.b2. Postanowiłem sprawdzić jak pójdzie mi kompilacja z linii poleceń.
Jest w menu Start -> Programy-> Qt for Symbian by Nokia v4.7.0-beta2 (S60) -> Qt for Symbian Command Prompt. Uruchomiłem to ale zaciekawiony byłem co to za skrót i okazało się że wykonuje on takie działanie: C:\WINDOWS\system32\cmd.exe /K C:\Qt\4.7.0.b2\bin\qtenv.bat Pojawiło mi się czarne okno do  wpisywania z linii poleceń. Napisałem tak

cd C:\Qt\4.7.0.b2\tools\qml

byłem już w folderze programu qml wpisałem

qmake

Wygenrowało mi pliki abld.bat, makefile i jak *.mmp. Postanowiłem najpierw zobaczyć jak dziala w emulatorze i wpisałem

make debug-winscw

zrobiło mi binarną wersję na emulatora i pozostało mi uruchomić. Wpisałem

make run

po jakimś czasie emulator uruchomił się z tym programem. Ale zreflektowałem się że w emulatorze nie mam plików z QtQuick. Zamknąłem emulator i przegrałem zawartość z folderu C:\Qt\4.7.0.b2\examples\declarative\animation do folderu C:\S60\devices\S60_5th_Edition_SDK_v1.0\epoc32\winscw\c\animation i uruchomiłem jeszcze raz emulator poleceniem

make run

i uruchomił mi sie program co sprawiło że mogłem wybrać ścieżkę do uruchomienia c:/animation/basic/color-animation.qml i zadziałało. No to teraz skompiluję qml na moją komórkę XM5800
Najpierw doinstalowywałem na kartę pamięci komórki następujące biblioteki w tej kolejności
C:\Qt\4.7.0.b2\qt_installer.sis
C:\Qt\4.7.0.b2\qt.sis
C:\Qt\4.7.0.b2\qtwebkit.sis
C:\Qt\4.7.0.b2\qt_demos.sis
C:\Qt\4.7.0.b2\fluidlauncher.sis

Po zainstalowaniu pomdlałem że znajdę jakieś programy typu oparte na QML. i zalazłem w folderze QtDemos takie jak qmlcalculator, qmlclocks, qmldialcontrol, qmleasing, qmlflickr, qmlphotoviewer, qmltwitter. Gdy uruchomiłem  qmldialcontrol to zauważyłem że zmiana położenia komórki blokuje program. doszedłem do wniosku że te programy wykorzystujące QML są jakby osadzone. To spróbuję skompilować na komórkę QML. Wróciłem do okna linii poleceń i wpisałem

make  release-gcce

i skompilowało się. Pozostało zrobić paczkę i wpisałem, żeby zrobiło mi paczkę bez podpisu

set QT_SIS_OPTIONS=-u

a potem

make sis

i pojawił się taki komunikat:


Auto-patching capabilities for self signed package.

Patching package file and relevant binaries...

Executing elftran -vid 0x0 -capability "NetworkServices ReadUserData" /S60/devic
es/S60_5th_Edition_SDK_v1.0/epoc32/release/gcce/urel/qmlviewer_patched_caps.exe

NOTE: A patched package should not be used for distribution!

Processing qmlviewer_release-gcce.pkg...
Created  qmlviewer_unsigned.sis.


Wygląda na to że nie można używać programu qmlviewer w dystrybucji.
Podpisałem swoim certyfikatem

signsis -s qmlviewer_unsigned.sis qmlviewer.sisx c:\key\imobile.cer c:\key\imobile.key 

Po zainstalowaniu tego okazało się że nie działa tak jak bym się spodziewał. Uruchamia się ale nie można wybrać żadnego pliku QML a nagłówek tytułowy wskazuje na plik zasobów content/Browser.qml, który nie mógł zostać uruchomiony z powodu restrykcji z dostępem do plików w Symbianie. Zrozumiałem że po zaprogramowaniu plików QML trzeba będzie pakować je w pliki zasobów oraz osadzać je jakby wewnątrz programu. Ale jak? Pewną wskazówkę dawały mi przykłady

C:\Qt\4.7.0.b2\demos\embedded\qmlcalculator
C:\Qt\4.7.0.b2\demos\embedded\qmlphotoviewer
C:\Qt\4.7.0.b2\demos\embedded\qmltwitter

Testowałem tworzenie takich paczek z powyższymi przykładami. Wyglądało to obiecująco ale nie do końca.
Nie wiem jak będę tworzył pliki QML z kodowaniem unicode (utf-8), bo przykłady dotyczą kodowania Latin1. Zauważyłem też że przestają przykłady działać jak zmieni się orientację W sumie to można już myśleć o pisaniu kolejnego artykułu o tym jak zaprogramować własną aplikację Qt Quick, pomimo że to jest jeszcze wersja beta 2 i będziemy jeszcze czekać na wersję Qt 4.7 RC