Tłumaczenie i adaptacja materiałów: dr Tomasz Xięski. Na podstawie prezentacji udostępnionych przez Digia Plc. na licencji CC.

Podobne dokumenty
Qt in Education. Sieć I drukowanie

- dodaj obiekt tekstowy: /** Maciej */ Stage { title : "First JavaFX App" scene: Scene { width: 300 height: 300 content: [ ] } }

Dynamiczne i wydajne tworzenie interfejsu. Piotr Michałkiewicz

Dodanie nowej formy do projektu polega na:

Ćwiczenie 1 Automatyczna animacja ruchu

Kurs programowania 2 - listy

HTML (HyperText Markup Language) hipertekstowy język znaczników

Założenia projektu: Projekt ma zadanie pokazać praktyczne zastosowanie App Inventor 2, poprzez stworzenie prostej aplikacji do nauki słówek.

Delphi podstawy programowania. Środowisko Delphi

Jak szybko i w prosty sposób zaprojektować aplikację przenośną. Optymalizacja

Galileo v10 pierwszy program

Visual Studio instalacja

Instrukcja InPro BMS Siemens FC700A InPro Professional 4.1

UWAGA: poniższe procedury przygotowane zostały w oparciu o program HiTi PhotoDesiree 2 w wersji

Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod:

4. Podstawowa konfiguracja

Temat 3. Projektowanie interfejsu użytkonwnika Kalkulator pierwszy program dla IOS

Rys. 1. Główne okno programu QT Creator. Na rysunku 2 oznaczone zostały cztery przyciski, odpowiadają kolejno następującym funkcjom:

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Laboratorium programowania urządzeń mobilnych

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Przewodnik... Tworzenie Landing Page

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

PHP 5 język obiektowy

Tłumaczenie i adaptacja materiałów: dr Tomasz Xięski. Na podstawie prezentacji udostępnionych przez Digia Plc. na licencji CC.

Architektura interfejsu użytkownika

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

EXSO-CORE - specyfikacja

Wprowadzenie do QT OpenGL

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

1. Umieść kursor w miejscu, w którym ma być wprowadzony ozdobny napis. 2. Na karcie Wstawianie w grupie Tekst kliknij przycisk WordArt.

Alfabetyczna lista stylów

Analiza i projektowanie aplikacji Java

Jak zrobić klasyczny button na stronę www? (tutorial) w programie GIMP

KARTA KURSU (realizowanego w module specjalności) Modelowanie 3D

ToonDoo Maker tworzenie pojedynczej sceny komiksowej

MVVM i XAML w Visual Studio 2015 / Jacek Matulewski. Gliwice, cop Spis treści

Programowanie w środowiskach RAD QtCreator, Qt i C++

Aplikacje WWW - laboratorium

Teraz bajty. Informatyka dla szkoły podstawowej. Klasa VI

Wprowadzenie do tworzenia zaawansowanych interfejsów graficznych: QGraphics View Framework vs. QML. Jakub Bogacz. Patryk Górniak

Wykład 8: klasy cz. 4

Lokalizacja Oprogramowania

Tabele. Przykład 15a.htm. <HTML><HEAD><TITLE> Cennik</TITLE></HEAD><BODY><H3>Cennik</H3> <TABLE BORDER="1"> <TR>

Edytor tekstu OpenOffice Writer Podstawy

Lekcja 1: Origin GUI GUI to Graficzny interfejs użytkownika (ang. GraphicalUserInterface) często nazywany też środowiskiem graficznym

Programowanie obiektowe

Warsztaty szkoleniowe. Technologia SafetyLon w systemach związanych z bezpieczeństwem funkcjonalnym Element logiczny Moduł 7.3.

KARTA KURSU (realizowanego w module specjalności) Modelowanie 3D

Tworzenie szablonów użytkownika

Aplikacje internetowe i rozproszone - laboratorium

Kraków, ver

MODYFIKACJE FORMATEK DOKUMENTÓW, KART MELDUNKOWYCH I POTWIERDZEŃ REZERWACJI W PROGRAMIE FAST REPORT

Dodatkowo planowane jest przeprowadzenie oceny algorytmów w praktycznym wykorzystaniu przez kilku niezależnych użytkowników ukończonej aplikacji.

Programowanie w środowiskach RAD Qt i C++

Ćwiczenie 3 - Tworzenie zmiennych i połączeń animacyjnych w InTouch u

Wzorce logiki dziedziny

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Ćwiczenie 25 Działania matematyczne we Flashu

Java - interfejs graficzny

Format HTML. Wybrane działy Informatyki Stosowanej. Definicja i przeznaczenie Struktura dokumentu Znaczniki Formularze i komponenty

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

KATEDRA MECHANIKI I PODSTAW KONSTRUKCJI MASZYN. Instrukcja do ćwiczeń laboratoryjnych z elementów analizy obrazów

Programowanie Urządzeń Mobilnych. Laboratorium nr 7, 8

OpenLaszlo. OpenLaszlo

Podstawy JavaScript ćwiczenia

Dzięki arkuszom zewnętrznym uzyskujemy centralne sterowanie wyglądem serwisu. Zewnętrzny arkusz stylów to plik tekstowy z rozszerzeniem css.

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Warszawa, Wytyczne dla projektu Biblioteka GUI

Programowanie Multimediów. Programowanie Multimediów JAVA. wprowadzenie do programowania (3/3) [1]

Wprowadzenie do biblioteki klas C++

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Podstawy programowania w Qt4

Programowanie Obiektowe GUI

UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

PROFINETSET narzędzie konfiguracyjne dla sieci PROFINET

Tutorial prowadzi przez kolejne etapy tworzenia projektu począwszy od zdefiniowania przypadków użycia, a skończywszy na konfiguracji i uruchomieniu.

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl

Komputerowe systemy na rynkach finansowych. wykład 5. MQL4 - funkcje operujące na obiektach wykresu

WAŻNE! colour.me Google Fonts tutaj

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

1. Przypisy, indeks i spisy.

Zadanie 3. Praca z tabelami

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Laboratorium 8 ( Android -pierwsza aplikacja)

16) Wprowadzenie do raportowania Rave

JavaFX. Programowanie Obiektowe Mateusz Cicheński

Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32

Diagramy klas. dr Jarosław Skaruz

Modelowanie części w kontekście złożenia

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

PyX jest pakietem Pythona do grafiki wektorowej. Pozawala zatem tworzyd pliki EPS oraz PDF.

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Jarosław Kuchta Podstawy Programowania Obiektowego. Podstawy grafiki obiektowej

Część II Wyświetlanie obrazów

GUI - projektowanie interfejsów cz. II

Gry Komputerowe Laboratorium 1. Zajęcia organizacyjne Animacja z uwzględnieniem czasu. mgr inż. Michał Chwesiuk 1/22. Szczecin,

Transkrypt:

Qt Quick

Tłumaczenie i adaptacja materiałów: dr Tomasz Xięski. Na podstawie prezentacji udostępnionych przez Digia Plc. na licencji CC. 2012 Digia Plc. The enclosed Qt Materials are provided under the Creative Commons Attribution-Share Alike 2.5 License Agreement. The full license text is available here: http://creativecommons.org/licenses/by-sa/2.5/legalcode. Digia, Qt and the Digia and Qt logos are the registered trademarks of Digia Plc. in Finland and other countries worldwide.

C++ jest dobrym wyborem do tworzenia aplikacji, a w szczególności: Struktur danych. Algorytmów. Logiki biznesowej. Prostych interfejsów użytkownika. C++ nie sprawdza się najlepiej w projektowaniu nowoczesnych i responsywnych interfejsów użytkownika gdzie: Wiele obiektów jest naraz aktywnych Występuje wiele często zależnych od siebie stanów Zmiany stanów i animacje muszą być płynne, reagować na zdarzenia np. czasowe

Wykorzystując Qt Quick, logika biznesowa i krytyczne operacje w dalszy ciągu mogą być zaimplementowane w C++ Interfejs użytkownika może zostać napisany korzystając z QML: QML - Qt Meta-object Language Język deklaratywny Bazuje na dobrze znanym języku Javascript

Qt Quick składa się z QML sam język Stworzony do budowania interfejsów użytkownika Może być wykorzystywany w innych zastosowaniach np. wymiana danych Qt Declarative moduł Qt Zawiera silnik QML, który tworzy interfejs Odwołania Qt <-> QML Mechanizmy do integracji C++ oraz QML Odpowiednich narzędzi i wsparcia w QtCreator

Qt Creator od wersji 2.0 wspiera QML Potrafi tworzyć projekty QML Potrafi uruchamiać i debugować QML

QML jest językiem deklaratywnym opartym na Java Script Dołączenie komponentów QtQuick Powiązanie właściwości i wartości import QtQuick 1.0 width: 200 height: 200 color: "red" Deklaracja elementu prostokąta stworzenie instancji obiektu Nazwy komponentów zawsze zaczynają się wielką literą

Dyrektywa import umożliwia dołączenie: Klas komponentów z modułów C++ Innych modułów QML plików Java Script import Qt 4.7 import MyCppClasses 1.2 import "from-qml" import "scripts.js" Gdy wykorzystywany jest moduł w C++, zawsze należy podać numer jego wersji

Tworząc elementy wewnątrz deklaracji innych elementów automatycznie tworzona jest ich hierarchia Text { Text { Text Text

Jest możliwym odwołanie się do obiektu rodzica używając jego nazwy. width: parent.width Text { color: parent.color Text {

Każdy element może mieć swój unikalny identyfikator (nazwę) id: outerrectangle... Do elementów odwołujemy się podając ich nazwę: { height: outerrectangle.height...

W QML wartości są przyporządkowywane nie są zwykle sztywnie przypisywane. W przykładzie zmiana położenia jednego prostokąta spowoduje zmianę położenia drugiego bo są od siebie zależne. id: firstrect x: 10... x: 400 - firstrect.x...

Zmiana wartości może być animowana id: firstrect x: 400 firstrect.x... SequentialAnimation { running: true loops: Animation.Infinite NumberAnimation { target: firstrect; property: "x"; to: 300 NumberAnimation { target: firstrect; property: "x"; to: 50

Podstawowe komponenty QtQuick: Rectangle prostokąt, Text tekst, Image obraz, BorderImage tworzy obramowanie na podstawie obrazu. Większość komponentów współdzieli szereg właściwości: x, y, szerokość (ang. width), wysokość (ang. height), kolor (ang. color), przeźroczystość (ang. opacity), widoczność (ang. visible), skalowanie (ang. scale), obrót (ang. rotation).

Możliwe jest wykorzystanie standardowych układów Qt (horizontal, vertical, grid), ale częściej stosuje się kotwice. Kotwice (ang. anchors) są wykorzystywane by przytwierdzić element do innego. anchors.fill: parent...... id: leftrectangle... anchors.left: leftrectangle.right...

Bardzo często kotwice stosowane są w połączeniu z marginesami: anchors.fill: parent anchors.margins: 5...... id: leftrectangle... anchors.left: leftrectangle.right anchors.leftmargin: 10...

Można przypiąć element do: lewej, górnej, prawej, dolnej części, wyśrodkować w pionie lub poziomie, linii bazowej Marginesy mogą być stosowane indywidualnie od siebie

Wykorzystując wbudowane w Qt typy układów można zrealizować klasyczny interfejs: Wartości muszą być wówczas przypisane, Odstępy między komórkami (ang. spacing) są globalne, Właściwość columns określa rozmiar siatki. Grid { columns: 2 spacing: 5 width: 20; height: 20; color: "red" width: 20; height: 20; color: "green" width: 20; height: 20; color: "blue"

Interakcja obsługiwana jest przez dodanie tzw. obszaru (ang. area), który jest niezależny od umieszczonych w nim komponentów graficznych: MouseArea obszar przechwytujący zdarzenia myszy GestureArea obszar dedykowany do obsługi gestów: Wspiera gesty dotykowe Niektóre proste urządzenia dotykowe mogą dostarczać jedynie zdarzenia identyfikowane jako Mouse Events. Zdarzenia związane z klawiaturą rejestruje komponent który aktualnie posiada focus.

Przycisk można zbudować korzystając z elementów: Rectangle, Text oraz MouseArea width: 200; height 100; color: "lightblue" Text { anchors.fill: parent text: "Press me!" Co się tutaj stało? Przyporządkowano funkcję javascript do sygnału MouseArea { anchors.fill: parent onclicked: { parent.color = "green"

Konieczność tworzenia wielu przycisków z trzech osobnych komponentów nie jest najlepszym rozwiązaniem. W QML występuje idea komponentów będących złożeniem poszczególnych elementów. Komponent może zostać powołany do życia tak samo jak pojedynczy element. Komponenty zazwyczaj tworzone są w osobnych plikach (modułach), które są dołączane dyrektywą include.

Plik Button.qml: import Qt 4.7 width: 200; height: 100; color: "lightblue" property alias text: innertext.text Text { id: innertext anchors.fill: parent MouseArea { anchors.fill: parent onclicked: { parent.color = "green"

Przyciski tworzone są w głównym pliku QML Główny plik QML powinien znaleźć się w tym samym katalogu co Button.qml W przeciwnym razie należy zaimportować katalog z Button.qml jako moduł import Qt 4.7 Row { spacing: 10 Button { text: "Oslo" Button { text: "Copenhagen" Button { text: "Helsinki" Button { text: "Stockholm"

Wykorzystując stany można łatwo tworzyć płynne animacje między zmianami zestawu właściwości normal large rotated

Właściwość states zawiera listę stanów w jakich może znajdować się element. import Qt 4.7 width: 400; height: 400; id: myrect width: 100; height: 100; anchors.centerin: parent color: "green"; states: [ State { name: "normal", State { name: "large", State { name: "rotated" ]

Każdy stan opisuje zestaw zmian właściwości states: [ State { name: "normal" PropertyChanges { target: myrect width: 100; height: 100; rotation: 0,... ]

Właściwość transitions opisuje w jaki sposób należy animować przejścia między zmianami stanów transitions: [ Transition { from: "*"; to: "normal" NumberAnimation { properties: "width, height" easing.type: Easing.InOutQuad duration: 1000 NumberAnimation { properties: "rotation" easing.type: Easing.OutElastic duration: 3000,... ]

Ustawienie stanu bezpośrednio: import Qt 4.7... MouseArea { anchors.fill: parent onclicked: { if(parent.state == "normal") { parent.state = "rotated"; else if(parent.state ==...

Lub przez przypisanie stanu jako wartość odpowiedniej właściwości: import Qt 4.7... state: mystate z poziomu której można się odwołać do kodu C++

Można przekazać wartości i obiekty jako zmienne globalne w QML. Takie przyporządkowanie wartości umożliwia logice biznesowej zapisanej w C++ kontrolowanie zmian w interfejsie QML. QML kontroluje wyłącznie interfejs użytkownika, wliczając w to tranzycie i inne efekty

QML jest wykonywany przez silnik QDeclarativeEngine Za jego pomocą można stworzyć dowolny element QML QGraphicsScene *scene = myexistinggraphicsscene(); QDeclarativeEngine *engine = new QDeclarativeEngine; QDeclarativeComponent component(engine, QUrl::fromLocalFile("myqml.qml")); QGraphicsObject *object = qobject_cast<qgraphicsobject *>(component.create()); scene->additem(object);

Łatwiej jest jednak stworzyć z widgetu QDeclarativeView Zawiera w sobie referencję do silnika QML Obsługuje tworzenie elementów QDeclarativeView *qmlview = new QDeclarativeView; qmlview->setsource(qurl::fromlocalfile("myqml.qml"));

Wszelkie operacje wykonywane są na warstwie kontekstu silnika QML Metoda setcontextproperty może być wykorzystana do ustawienia zmiennych globalnych QDeclarativeView *qmlview = new QDeclarativeView; QDeclarativeContext *context = qmlview->rootcontext(); context->setcontextproperty("mystate", QString("normal")); qmlview->setsource(qurl::fromlocalfile("myqml.qml"));

Wykorzystanie przyporządkowania a nie przypisania powoduje, że zmiana wartości właściwości w C++ implikuje zmianę w QML void Window::rotateClicked() { QDeclarativeContext *context = qmlview->rootcontext(); context->setcontextproperty("mystate", QString("rotated")); void Window::normalClicked() { QDeclarativeContext *context = qmlview->rootcontext(); context->setcontextproperty("mystate", QString("normal")); void Window::largeClicked() { QDeclarativeContext *context = qmlview->rootcontext(); context->setcontextproperty("mystate", QString("large"));

QObject uwidaczniany jest najczęściej jako tzw. context property, co umożliwia dostęp do slotów QDeclarativeView *qmlview = new QDeclarativeView; QLabel *mylabel = new QLabel; QDeclarativeContext *context = qmlview->rootcontext(); context->setcontextproperty("thelabel", mylabel); MouseArea { anchors.fill: parent onclicked: { thelabel.settext("hello Qt!");