Qt na mobilních zařízeních

Podobné dokumenty
Vývoj multiplatformní aplikace v Qt

Multiplatformní GUI knihovna

Nástroje pro vývoj a publikaci mobilní aplikace v Qt. Martin Straka

Nástroje pro vývoj a publikaci mobilní aplikace v Qt. Martin Straka

Multiplatformní GUI toolkity

25. listopadu 2014, Brno Připravil: David Procházka QML (2) Programovací jazyk C++

Vývoj aplikací v Qt pro mobilní zařízení

25. listopadu 2014, Brno Připravil: David Procházka. Qt a QML. Programovací jazyk C++

Uživatelská rozhraní 10. cvičení. Martin Němec A

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

PROGRAMOVÁNÍ V C++ CVIČENÍ

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Obsah. O autorech 9 Earle Castledine 9 Myles Eftos 9 Max Wheeler 9 Odborný korektor 10. Předmluva 11 Komu je kniha určena 12 Co se v knize dočtete 12

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

UJO Framework. revoluční architektura beans. verze

ANT. Aplikační programování v Javě (BI-APJ) - 1 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Efektivní vývoj mobilních aplikací na více platforem současně. Mgr. David Gešvindr MCT MSP MCPD MCITP

PREPROCESOR POKRAČOVÁNÍ

Úvod 13 O čem je tato kniha? Pro koho je tato kniha? Jak studovat tuto knihu? Poděkování 16 Zpětná vazba od čtenářů Zdrojové kódy ke knize Errata 17

Úvod do programovacích jazyků (Java)

KNIHOVNA QT4, PROSTŘEDÍ QTCREATOR A MOŽNOSTI JEJICH VYUŽITÍ

NSWI096 - INTERNET JavaScript

Doxygen. Jakub Břečka

PB161 Programování v jazyce C++ Přednáška 10

Pokročilé programování v jazyce C pro chemiky (C3220) Knihovna Qt část 2

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

C++ 0x aka C++11. Základním kamenem je třída std::thread

Jazyk C# (seminář 6)

Skriptovací jazyky. Obsah

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Jakub Čermák Microsoft Student Partner

Začínáme s vývojem pro Android

Fakulta stavební. Grafické rozhraní pro GNU Sqltutor

Formy komunikace s knihovnami

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Desktop GUI. IW5 - Programování v.net a C# Desktop GUI

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Android 100% Java telefon. Petr Musil

MBI - technologická realizace modelu

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Mobile application developent

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Chain of responsibility

Embedded vývoj v Clutteru a Mx

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v Javě I. Leden 2008

PB161 Programování v jazyce C++ Přednáška 9

Generické programování

TÉMATICKÝ OKRUH Softwarové inženýrství

MySQL sežere vaše data

Projekty pro výuku programování v jazyce Java

PŘETĚŽOVÁNÍ OPERÁTORŮ

Vytváření a použití knihoven tříd

Jazyk C++ II. Šablony a implementace

PB161 Základy OOP. Tomáš Brukner

Jakub Čermák Microsoft Student Partner

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

Code Contracts. Robert Haken [MVP ASP.NET, MCT] Software architect, Owner at HAVIT, s.r.o. knowledge-base.havit.cz

Metody zabezpečeného přenosu souborů

ios Cvičení RSS čtečka

Software602 Form Designer

Programování v Javě I. Únor 2009

Práce s knihovnami. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

PB161 Programování v jazyce C++ Přednáška 10

18. února 2015, Brno Připravil: David Procházka. Programovací jazyk C++

Základy programování (IZP)

České vysoké učení technické v Praze. Fakulta Elektrotechniky XD39NUR. Semestrální práce. Ovládání videokonferencí pomocí mobilního telefonu

Nástroje na vývoj aplikací pro ios Trocha motivace na úvod Co budete potřebovat Co když nemáte k dispozici počítač s macos? Vývojové prostředí Xcode

Na začátku bych chtěl poděkovat vedoucímu bakalářské práce Prof. Ing. Aleši Čepkovi, CSc za výuku předmětů Informatika 1,2,3, Projekt - Informatika a

Programování v C++ 2, 8. cvičení

CMS LARS VIVO VERZE 1.2 Z POHLEDU VIVOJÁŘE

Programování v C++ 1, 5. cvičení

Čipové karty Lekařská informatika

InterSystems Caché Post-Relational Database

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Výčtový typ strana 67

IUJCE 07/08 Přednáška č. 1

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Použití inteligentních značek s informačními službami

Jak importovat profily do Cura (Windows a

Jazyk C# (seminář 3)

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Mediator motivace. FontDialog. závislosti mezi jednotlivými ovládacími prvky jsou netriviální

Úvodem... 9 Kapitola 1 Karetních

Co je (staro)nového v DSpace

PB přednáška (23. listopadu 2015)

DEVFEST ANGULAR 2 WORKSHOP. angular.cz

Vývoj software pro Linuxové distribuce. Installfest Praha,

ANGULAR 2 WORKSHOP. angular.cz

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Michal Podzimek

Java - řazení objektů

Dědičnost (inheritance)

Transkript:

Qt na mobilních zařízeních Vývoj mobilní Datovky Karel Slaný karel.slany@nic.cz 24. 11. 2017

Stav projektu Datovka v roce 2016 desktopová Datovka UNIX/Linux, mac OS, Windows Od verze 4.8.1 nepodporujeme Windows XP. Qt 5.3 (5.2+), OpenSSL, libisds Datovka pro Android TinyISDS, ISDSCommon, Java idatovka ObjC Byl požadavek na sjednocení funkcionality a vývoje mobilních Datovek.

Qt 5 Qt 5.0/12-2012 - proti Qt 4 vylepšená podpora QML a JavaScript kompatibilní s Qt4 abstrakce nad platformami X11, Wayland, Windows, Android, Jolla, macos, ios, QNX/Blackberry10 plná podpora pro Android, ios, WinRT ios a Android od 5.2/12-2013 (5.1/07-2013) WinRT od (5.3/05-2014) Desktopová Datovka 4 je v Qt, chtěli jsme využít již existující kód.

Aplikace v Qt *.pro qmake: *.pro Makefile *.ui uic: *.ui ui_*.h *.h + *.cpp moc: *.h moc_*.cpp *.qml (deklarované v *.res) rcc -name qml res/qml.qrc -o qrc_qml.cpp # project.pro QT += core gui network sql printsupport widgets TEMPLATE = app APP_NAME = datovka VERSION = 4.7.1 DEFINES += DEBUG=1 QMAKE_CXXFLAGS = -g -O0 -std=c++11 INCLUDEPATH += src LIBS = -lisds -lcrypto SOURCES +=... HEADERS += FORMS += RESOURCES += TRANSLATIONS +=... /* qrc_qml.cpp */ static const unsigned char qt_resource_data[] = { /*... */ // qml/main.qml 0x0,0x0,0xc,0xa, 0x0, 0x0,0x2b,0x77,0x78,0x9c,0xed,0x1a,0x6b,0x73, 0xdb,0xb8,0xf1,0xbb,0x7f,0x5,0x4e,0xbd,0x99, 0x93,0xf2,0Xa0,... /*... */ ;

Vývoj mobilní aplikace v Qt Předpokládá se použití Qt Quick. Kromě Qt je potřeba (dle cílové platformy): Android SDK a NDK, Java SE JDK, Apache Ant XCode + Command Line Tools Visual Studio 2013 (2015 pro Windows 10) Výsledná aplikace je v nativním binárním kódu pro cílovou platformu.

QML / Qt Quick deklarativní jazyk syntaxe podobná JSON navrženo pro dotykové ovládání, animace, styly, podpora JavaScript strom objektů reprezentující elementy Dají se sestavovat vlastní komponenty. Lze integrovat vlastní elementy napsané v C++.

Aplikace v Qt Quick smyčka aplikace QML engine nahraje se QML Lze psát programy pouze v QML. /* qml/main.qml */ import QtQuick 2.0 Item { id: item width: 100; height: 100 signal qmlsignal(string msg) MouseArea { anchors.fill: parent onclicked: item.qmlsignal("hello from QML") /* main.cpp */ #include <Qapplication> #include <QtQuick> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); /* QQuickView view(qurl::fromlocalfile("qml/main.qml")); view.show(); */ QQmlApplicationEngine engine; engine.load( QUrl(QStringLiteral("qrc:/qml/main.qml"))); return app.exec();

QML a C++ objekty QQuickItem, QObject /* QmlObj.qml */ import QtQuick 2.7 Item { id: root property int val : 0 /* CppObj.cpp */ #include <QDebug> #include "CppObj.h" /* CppObj.h */ #pragma once #include <QObject> class CppObj : public QObject { Q_OBJECT public: explicit CppObj(QObject *parent = Q_NULLPTR); Q_INVOKABLE void setval(int val); signals: void signalvalue(int val); public slots: void dosomething(int val); private: int m_val; ; signal signalvalue(int sigval) function dosomething(val) { console.log("value " + val) onsignalvalue: { dosomething(sigval) CppObj::CppObj(QObject *parent) : QObject(parent), m_val(0) { connect(this, SIGNAL(signalValue(int)), this, SLOT(doSomething(int))); void CppObj::setVal(int val) { m_val = val; void CppObj::doSomething(int val) { qdebug() << "Value" << val;

Dědičnost v QML Jeden soubor definuje strukturu jedné komponenty. Jméno souboru je důležité. /* main.qml */ import "components" // import cz.nic.mobiledatovka 1.0 Item { id: item01 /* components/spinboxzeromax.qml */ import QtQuick.Controls 2.0 SpinBox { property var items: [1, qstr("max")] property int dfltidx: 0 from: 0 to: items.length - 1 /* Last is infinite. */ textfromvalue: function(idx) { /* text at idx */ valuefromtext: function(text) { /* idx with text */ function val() { /* value at current index */ SpinBoxZeroMax { id: spibbox function setval(v) { /* set index nearest to v */ /* main.cpp */ QmlRegisterType(Qurl("qrc:/components/SpinBoxZeroMax"), "cz.nic.mobiledatovka", 1, 0, "SpinBoxZeroMax");

C++ do QML přístup k objektům přístup k třídám parametry přes Qvariant nebo QString /* main.qml */ import Qt.Quick 2.7 import cz.nic.mobiledatovka 1.0 CppObj { id: object val: 0 Item { id: obj property int val: objcpp.val /* main.cpp */ #include "CppObj.h" /* CppObj.h */ #pragma once #include <QObject> class CppObj : public QQuickItem { Q_OBJECT Q_PROPERTY(QString val READ val WRITE setval NOTIFY valchanged) public: CppObj(QObject *parent = Q_NULLPTR) : QObject(parent), m_val(0) { int val(void) const { return m_val; void setval(const QVariant &v) { bool ok; int i = v.toint(&ok); if (ok) { m_val = i; emit valchanged(); signals: void valchanged(void); private: int m_val; ; Q_DECLARE_METATYPE(CppObj) QQmlApplicationEngine engine; QQmlContext *ctx = engine.rootcontext(); CppObj obj; ctx->setcontextproperty("objcpp", &obj); qmlregistertype<cppobj>("cz.nic.mobiledatovka", 1, 0, "CppObj");

QML do C++ příklad: blokující dialog vyhledání objektu ne vše je QQuickItem pozor na vlákna /*.cpp */ QEventLoop loop; /* Must lie in same thread as engine. */ QQmlApplicationEngine engine; /*... */ QList<QObject *> objlist = engine.rootobjects() QObject *root = objlist.first(); /* QQuickItem */ QObject *dlg = = root->findchild<qobject *>("dialogue", Qt::FindChildrenRecursively); /* not a QQuickItem. */ dlg->setproperty("title", QVariant("Dialogue message")); QObject::connect(dlg, SIGNAL(dialogueClosed()), &loop, SLOT(quit())); /* Show dialogue. */ QMetaObject::invokeMethod(dlg, "open"); loop.exec(); /* Wait for dialogue to close. */ /* dialogue.qml */ import QtQuick 2.7 import QtQuick.Controls 2.0 import QtQuick.Dialogs 1.2 /* * objectname properties are used to * navigate through the structure from * within C++ code. */ Item { id: root objectname: "root" signal dialogueclosed() Dialog { id: dialogue objectname: "dialogue" /* Set from C++. */ title: "" modality: Qt.ApplicationModal StandardButtons: StandardButton.Ok StandardButton.Cancel onaccepted: { root.dialogueclosed() onrejected: { root.dialogueclosed()

Vykonávání QML Struktura stromu objektů a jejich závislostí (signály, sloty) je vytvořena při inicializaci - QQmlApplicationEngine::load(). Chyby často způsobí pád aplikace. JavaScript je interpretován, když je potřeba. Chyby se projeví za běhu aplikace, někdy způsobí pád, někdy zamrznutí. Import statement slouží spíše k deklaraci požadované funkcionality. Pokud QML funguje na jedné platformě, není jisté, že na ostatních platformách bude program fungovat také.

QML best practice 3 programové vrstvy prezentace/zobrazování dat (QML) konverze dat pro prezentaci, zpracování uživatelských vstupů pro jádro (C++) jádro aplikace pro komunikaci se serverem a správu uložených dat Udržovat QML v přehledné a krátké formě. Minimalizovat použití JS v QML, funkce psát raději v C++ a exportovat do QML.

Obcházení nedostatků Qt AndroidExtras soubor tříd a objektů pro komunikaci s Androidem Lze volat kód v Javě. požíváme s Android Intent (zpracování událostí) MacExtras Zpřístupňuje některé funkce OS X specifické datové typy, grafika a GUI komunikace se správcem oken málo funkcí (protože jich není zapotřebí?) Lze psát funkce v ObjC, které mají rozhraní v C. SWIFT je kompatibilní s ObjC. Lze psát funkce v C++, které mají rozhraní v C.

Dokumentace Qt Rozhraní C++ má vynikající dokumentaci (Qt Assistant). Dokumentace QML se nese v podobném duchu, ale Mnohé komponenty jsou potomky jiných. Často chybí informace, co je rodič komponenty. Kompletní funkcionalitu lze odhadnout až ze zdrojových souborů. Komponenty se v různých verzích (import...) liší v některých atributech. V mnoha případech není uvedeno, kdy byl který atribut přidán. Pomáhá použití Qt Creatoru.

Vzhled ovládacích prvků QuickControls 1.4 starší, více komponent, desktopový vzhled QuickControls 2.0 (Qt 5.7/06-2016) (2.1) moderní mobilní vzhled, méně typů komponent chybí např. TableView

Bolístky někdy rozsypané fonty na ios řešení: zdola omezit velikost fontů

Další bolest Občas potřebujeme QML dialogy, které blokují vykonávání C++ kódu. Dialogy v QML jsou sice pěkné a blokující ale Na Androidu po zobrazení ukradnou funkci tlačítka zpět. Na ios se po zobrazení zablokuje smyčka událostí a aplikace zamrzne. Na desktopu fungují bez problémů. :)

Dialogy

Chyby v Qt It s not a bug - it s a feature. Vývojáři Qt raději implementují novou funkcionalitu než opravují staré chyby. otevírání emailů na ios workaround since Qt 5.2 The fix would break backward compatibility. Problém napojení a zpracování signálů mezi C++ a QML na ios. A conceptual change needed, fix likely in Qt 6. V Qt 5.8 jde na Androidu konečně vkládat text ze schránky.

Získané poznatky Jsme relativně spokojeni s použitelností Qt pro vývoj mobilní aplikace. Funguje-li něco na jedné platformě, ještě to nemusí fungovat všude. Změna způsobu ovládání a vzhledu vyvolala nečekanou vlnu negativních reakcí.

Děkuji za pozornost Karel Slaný karel.slany@nic.cz