graafisen käyttöliittymän ohjelmointi syksy 2011grako/2013/luennot/13qml.pdf · qml •qml (qt...

46
Graafisen käyttöliittymän ohjelmointi Syksy 2013 Luento 13 QML Antti Nieminen

Upload: others

Post on 18-Jul-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Luento 13

QML

Antti Nieminen

Page 2: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Sisältö

• Johdanto

• QML:n perusteita

• JavaScript QML:ssä

• C++ ja QML

Page 3: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML

• QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien tekoon

• Käytetään erityisesti mobiilikäyttöliittymissä

• Qt Quick = ”QML:n standardikirjasto”

• Nämä kalvot käsittelevät QML:n ja Qt Quick:in versiota 2.0 sekä Qt:n versiota 5.0 ellei toisin mainita

Page 4: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML:n etuja

• Yksinkertainen, deklaratiivinen syntaksi

• Renderöidään OpenGL:llä

– > nopea ja kaunis käyttöliittymä

• JavaScript-tuki

• Helposti liitettävissä C++-koodiin

– Voidaan toteuttaa esim. käyttöliittymä QML:llä ja sovelluslogiikka C++:lla

Page 5: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Esimerkki 1

import QtQuick 2.0 Rectangle { width: 360 height: 360 Text { anchors.centerIn: parent text: "Hello World“ } MouseArea { anchors.fill: parent onClicked: { Qt.quit(); } } }

Page 6: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML-tiedoston suoritus

• QML-tiedoston voi suorittaa mm.

1. Qt:n mukana tulevalla qmlscene-sovelluksella

• qmlscene tiedostoni.qml

2. Luomalla Qt Creatorilla Qt Quick –projektin

3. Tavallisessa Qt C++ -projektissa

• Tästä lisää kalvojen loppupuolella

Page 7: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML on deklaratiivinen

• QML on deklaratiivinen kieli

• Deklaratiivisellä kielellä kuvataan millainen lopputulos halutaan

– vs. imperatiivinen kieli: määritellään vaiheet jotka suorittamalla lopputulokseen päästään

• QML-dokumentti voi sisältää myös imperatiivisia osia

– Toteutetaan JavaScript-kielellä

Page 8: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Deklaratiivinen vs. imperatiivinen

Rectangle { id: laatikko color: ”blue” MouseArea { onClicked: { laatikko.color = ”red”; } } }

Page 9: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML-dokumentti

• QML-dokumentti koostuu olioista, jotka muodostavat puumaisen rakenteen – Yhdessä dokumentissa tasan yksi korkeimman tason olio – Olion vanhempaan voi viitata parent-attribuutin kautta

Rectangle { color: ”red” Rectangle { color: parent.color } }

Page 10: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML-olio

• QML-oliolle täytyy määritellä sen tyyppi • Lisäksi olio voi sisältää erilaisia attribuutteja sekä

lapsiolioita

<OLIOTYYPPI> { <ATTRIBUUTTI1>: <ARVO1> <ATTRIBUUTTI2>: <ARVO2> … <LAPSIOLIO1> <LAPSIOLIO2> … }

Page 11: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML-oliotyypit

• Visuaaliset oliot (visual objects) – Rectangle, Image, Text, … – Kaikki periytyvät Item-tyypistä

• Syötteenlukuoliot (user input objects) – MouseArea, Keys, PinchArea, …

• Asemointioliot (positioning objects) – Positioner, Row, Column, …

• Ja paljon muita – http://qt-project.org/doc/qt-5.0/qtquick/qtquick-

qmltypereference.html

• Myös omia tyyppejään voi luoda – Joko QML:llä tai C++:lla

Page 12: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML-tiedostot

• Samassa hakemistossa oleviin QML-dokumentteihin voidaan viitata suoraan tiedoston nimellä (ilman päätettä) – > näin voidaan luoda omia oliotyyppejä

• Laatikko.qml: Rectangle { width: 100; height: 100 } • Toinen.qml: Row { Laatikko { color: ”blue” } Laatikko { color: ”red”} }

Page 15: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

id-attribuutti

• Oliolle voi asettaa id:n, jolla siihen voi viitata muista olioista

Rectangle { Rectangle { id: laatikko1 color: ”red” } Rectangle { id: laatikko2 color: laatikko2.color } }

Page 16: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Property-attribuutit

• QML-olioiden property-attribuutit ovat tyypitettyjä – Perustyypit: int, real, string, color, …

– QML-oliotyypit: Rectangle, Item, …

– var-tyyppiset propertyt voivat sisältää mitä vain

• Oman propertyn määrittely, esimerkki:

Rectangle {

property string tervehdys: "Moro!"

}

Page 17: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Propertyn arvo

• Property-attribuutit voivat sisältää joko

– staattisen arvon:

• width: 100; color: "red";

– tai dynaamiseen lausekkeen:

• width: parent.width / 2

• color: checkbox1.checked ? "red" : "blue"

• Dynaamisessa tapauksessa propertyn arvo päivittyy automaattisesti lauseekkeen arvon muuttuessa ->

Page 18: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Property binding

• Propertyn arvon ”sitomista” riippumaan jostain muusta/muista property(i)stä kutsutaan nimellä property binding

• Esim: Rectangle { width: box1.width + box2.width + 50 }

• Aina kun jokin lausekkeen oikealla puolella olevista propertyistä muuttuu, muuttuu automaattisesti myös propertyn arvo

Page 19: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Esimerkki 2

import QtQuick 2.0 Rectangle { width: 400; height: 300; Rectangle { width: parent.width / 2 height: parent.height / 2 color: parent.width > parent.height ? ”red” : ”blue” } }

Page 21: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

State

• QML-oliolle voi määritellä erilaisia tiloja (State) • Olion states-attribuutti sisältää listan State-olioita • State-oliossa määritellään erot olion perustilaan

– Perustila on nimeltään tyhjä merkkijono ””

State { name: “pohjassa”; when: mouseArea.pressed PropertyChanges { target: o1; color: “yellow”} }

Page 22: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Esimerkki 3

Import QtQuick 2.0 Rectangle { id: root width: 400; height: 300; color: "yellow" MouseArea: { id: mouseArea; anchors.fill: parent } states: [ State { name: "pohjassa" when: mouseArea.pressed PropertyChanges { target: root; color: "red"} } ] }

Page 24: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Signaalit

• QML-oliotkin lähettelevät signaaleja

• Valmiilla QML:n oliotyypeillä on signaaleja, esim. MouseArea:n clicked

• Signaaleja voi määritellä myös itse

– signal munSignaali(string parametri)

• Signaali lähetetään yksinkertaisesti kutsumalla sitä JavaScriptillä

– munSignaali(”moi”);

Page 25: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Signaalinkäsittelijät

• Signaaleja voi QML:ssä vastaanottaa signaalinkäsittelijöillä (signal handlers)

– kuten Qt:n slotit

• Signaalia nimeltä foo kuunnellaan määrittelemällä olioon käsittelijä nimellä onFoo

• Signaalinkäsittelijä toteutetaan JavaScript-kielellä

Page 26: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Esimerkki 4

import QtQuick 2.0 Rectangle { width: 400; height: 300; signal jotainTapahtui(string jotain) onJotainTapahtui: { teksti.text = ”tapahtui ” + jotain; } MouseArea { anchors.fill: parent onClicked: { jotainTapahtui(”klikkaus”); // lähetetään signaali } } Text { id:teksti, text:”klikkaa”} }

Page 27: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Propertyjen arvojen muutos

• Kun propertyn bar arvo muuttuu, lähtee tästä automaattisesti signaali barChanged

• Muutoksia voi siis kuunnella määrittelemällä käsittelijän onBarChanged

Rectangle { property real arvo onArvoChanged: { // … } }

Page 28: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

JavaScript QML:ssä

• JavaScript-kieltä voidaan käyttää monella tapaa QML-dokumenteissa – Property binding –lausekkeet – Signaalinkäsittelijät – Itse määritellyt JavaScript-funktiot – Importoidut JavaScript-kirjastot

• QML:n JavaScript ei ole aivan yhtä salliva kuin webbiselaimissa – Esim. ”globaalia oliota” (global object) ei voi muokata

• http://qt-project.org/doc/qt-5.0/qtqml/qtqml-javascript-expressions.html

Page 30: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

JavaScript ja property binding

• Property binding –lauseke on käytännössä tavallinen JavaScript-lauseke, joka suoritetaan automaattisesti aina tarvittaessa – width: Math.max(box1.width, box2.width)

• Property binding voidaan tehdä myös JavaScript-koodissa – width = Qt.binding(function(){return box1.width;})

• Huom! Pelkkä sijoitus ei sido vaan ainoastaan asettaa arvon kertaalleen – width = box1.width

Page 31: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QtQuick:n moduuleita

• Controls

– ”Tavallisia” käyttöliittymäkomponentteja QML:ssä!

– Qt 5.1, QtQuick 2.1

• Window

– Tukea top-level-ikkunan toteutukseen

• Particles

– Partikkeliefektejä QML:ssä

• Jne.

Page 32: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Controls Gallery

• Demo

– qtquickcontrols/examples/quick/controls/gallery

Page 35: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML:n käyttöönotto Qt C++ -projektissa

• Projektitiedostossa:

QT += qml quick

• C++:ssa esimerkiksi:

QQuickView view;

view.setSource(QUrl::fromLocalFile("file.qml"));

view.show();

Page 36: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML-oliot C++:ssa

• Kutakin QML-oliotyyppiä vastaa jokin QObject:ista periytyvä luokka

• Visuaaliset oliot periytyvät luokasta QQuickItem

• C++-puolelta voi QML-olioita hakea niiden objectName-attribuutin perusteella

– Ei siis id:n

Page 37: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML-oliot C++:ssa

• QML: Rectangle { Rectangle { objectName: ”olio1” } } • C++: QQuickView* view = new QQuickView(filename); QQuickItem* olio1 = view->rootObject()-> findChild<QQuickItem*>("olio1"); olio1->setProperty("color", "red");

Page 38: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML-olioiden signaalit

• QML-olioiden signaaleja voidaan vastaanottaa C++:ssa kuin muitakin signaaleja

QQuickView* view = new QQuickView("view.qml"); QObject::connect(view->rootObject(), SIGNAL(munSignaali()), view, SLOT(close())); view.qml: Rectangle { signal munSignaali … }

Page 39: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

JavaScript-funktion kutsuminen

• QML: Rectangle { function foo(s) { return s+”!”; } } • C++: QVariant paluuarvo; QVariant parametri = ”moi”; QMetaObject::invokeMethod(qmlObj, ”foo”, Q_RETURN_ARG(Qvariant, paluuarvo), Q_ARG(QVariant, parametri));

Page 40: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

C++-olio QML:ssä

• C++-olioita on mahdollista määritellä QML:ssä käytettäväksi – Lisätään se QML-olion kontekstiin (QQmlContext) jollain

nimellä – Periydyttävä joko QObject- tai QVariant-luokasta

QVariant t = new QVariant(”Moro”); view->rootContext()->setContextProperty(“tervehdys”, t); QML: Text { text: tervehdys }

Page 41: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

C++-metodin kutsuminen QML:ssä

• Jotta luokan metodia voi kutsua QML:stä on sen esittelyssä oltava Q_INVOKABLE-makro

class ExampleClass : public QObject { Q_OBJECT public:

Q_INVOKABLE QString exampleMethod(); … • Lisättynä QML-kontekstiin nimellä ”example”: Text { text: example.exampleMethod() }

Page 42: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

C++-olioiden propertyt

• C++-olioillekin voi määritellä propertyjä – Q_PROPERTY-makro

Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) public: Qcolor color() const; void setColor(const Qcolor &color); public signals: void colorChanged();

Page 43: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

QML Qt-käyttöliittymässä

• QML-dokumentti on mahdollista "upottaa" tavalliseen Qt C++ -käyttöliittymän sisään

• Tätä varten QQuickWindow (tai QQuickView) on käärittävä QWidget:iin – Onnistuu funktiolla QWidget::createWindowContainer (Qt

5.1)

QQuickView* view = new QQuickView(filename); QWidget *container = QWidget::createWindowContainer(view); myLayout->addWidget(container);

Page 44: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Oliotyyppien määrittely C++:lla

• C++:lla voi määritellä myös oliotyyppejä QML:n käyttöön – QQmlEngine::qmlRegisterType

qmlRegisterType<PieChart>(”Charts”, 1, 0, ”PieChart”); QML: import Charts 1.0 PieChart { … }

Page 46: Graafisen käyttöliittymän ohjelmointi Syksy 2011grako/2013/luennot/13qml.pdf · QML •QML (Qt Meta Language tai Qt Modeling Language) on deklaratiivinen kieli käyttöliittymien

Yhteenveto: QML-olio

• QML-oliolla on kolme rajapintaa

– QML

– JavaScript

– C++ (QObject)

QML-olio

C++ JavaScript

QML