Top Banner
Graafisen käyttöliittymän ohjelmointi Syksy 2013 Luento 13 QML Antti Nieminen
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

Jul 18, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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