Portál AbcLinuxu, 30. dubna 2025 22:51
Doposud jsme se v rámci seriálu o vývoji mobilních aplikací v Qt Quick seznamovali s vývojovým prostředím (Qt SDK a Qt Creatorem) a předvedli jsme si, jak si přeložit svou první aplikaci v QML. O tomhle zajímavém deklarativním jazyce jsme si pak podrobněji pověděli v druhé části seriálu. Probrali jsme strukturu QML a aplikací, do krve se nám snad i dostala syntaxe jazyka a máme i představu, kam Qt Quick patří v rámci frameworku Qt. V následujících dílech budeme pokračovat v rozšiřování našich znalostí a v tomto se zaměříme na komponenty v QML.
A komponenty nás budou provázet taky celým článkem – pro začátek naše vlastní (Qt Components se bude podrobněji věnovat minimálně jeden celý díl seriálu) a výrazně nám usnadní tvorbu našich aplikací. Zpřehlední nám zdrojový kód, který by se jinak stal dlouhou nudlí skládající se z kopírování a vkládání kusů kódu. Tím se také tyto části kódu stanou znovupoužitelné pro použití jak v rámci aplikace, tak i dalších následujících projektů. V případě uvolnění pod open source licencí pak mohou posloužit i ostatním vývojářům v naší rozrůstající se komunitě. QML je jako jazyk navíc velmi vhodný k rychlému prototypování návrhu aplikace a následný refaktoring aplikace do komponent se udělá v podstatě skoro sám. Vývojáře tak k němu přímo vybízí a dochází k symbióze návrhu a implementace aplikace.
Komponenty můžeme nadefinovat jak ve vlastním souboru, tak i v rámci již existujícího QML zdrojového kódu. První případ je vlastně klasický QML dokument, který obsahuje vyžadované importy (minimálně QtQuick) a jeden prvek nejvyšší úrovně (často se jedná o element Item představený v předchozí části seriálu) s popisem vlastností a chování komponenty. Soubor s definicí komponenty musí začínat velkým písmenem s příponou .qml. Tímto jménem se pak následně ve zdrojovém kódu aplikace na komponentu odkazujeme. Druhou možností je pak vytvoření nové komponenty právě v rámci jiného QML dokumentu (či komponenty). Pro tento případ máme k dispozici element Component. Hojně se využívá pro oddělení menší části kódu do vlastní komponenty bez nutnosti vytvářet bokem nový soubor a to především pro opakující se prvky. Například jako delegát pro opakovače (repeatery) a ListView element, jak jsme si bez vědomí znalosti komponent ukázali v minulém dílu. Opět především z důvodu přehlednosti zdrojových kódů.
V následujícím příkladu si napíšeme dvě komponenty – čtverec a obdélník a ty následně vytvoříme pomocí elementu Loader do jednoho řádku (element Row), kde se taky zobrazí. Všimněte si, že obě komponenty mají vlastní id a to je taky jediná vlastnost, která jde v rámci elementu Component nejvyšší úrovně nastavit. O Loaderu a dalších možnostech, jak vytvářet komponenty dynamicky, si povíme v jednom z následujících dílů seriálu o pokročilých vlastnostech QML.import QtQuick 1.0 Rectangle { width: 300 height: 100 Component { id: ctverec Rectangle { width: 100; height: 100; color: "blue" } } Component { id: obdelnik Rectangle { width: 200; height: 100; color: "red" } } Row { anchors.fill: parent Loader { sourceComponent: ctverec } Loader { sourceComponent: obdelnik } } }
Využití v rámci delegátu si představíme na závěr článku v rámci naší první malé, ale skutečné aplikace. Jaká to bude, si zatím necháme jako tajemství. Nechte se překvapit!
K tvorbě skutečného uživatelského rozhraní jsou ovšem potřeba přece jenom složitější komponenty než jen výše předvedený čtverec a obdélník. Mají definované rozličné vlastnosti, složitější chování a případně i reagují na akce uživatele. A čisté Qt Quick nechává tuto práci na vývojářích. Protože kromě základních elementů představených v minulém dílu seriálu k jejich obvyklému překvapení neobsahuje žádné elementy/komponenty pro tvorbu uživatelských rozhraní. My si teď ukážeme jak takovou komponentu, která bude vypadat tak, jak jsme si popsali výše, vytvoříme. Tlačítko je jeden z nejzákladnějších prvků uživatelských rozhraní a bude tedy první komponentou, kterou si navrhneme.
Začneme vytvořením nového souboru (v Qt Creatoru buď pomocí menu File -> New File or Project nebo kliknutím pravého tlačítka ve stromové struktuře projektu a výběrem položky Add New, následně vybereme QML a QML File), který pojmenujeme Button.qml. Qt Creator nám pak předgeneruje šablonu, kterou budeme dále rozvíjet.
import QtQuick 1.1 Rectangle { id: container width: 100; height: 40; radius: 5
Pro naše tlačítko použijeme jako výchozí prvek klasický obdélník (Rectangle) a nastavíme si jeho id na container (bude sloužit jako kontejner pro další prvky). Pomocí vlastnosti radius pak naše tlačítko trošku zjemníme a zakulatíme jeho rohy.
property color buttonColor: "red" property alias buttonText: label.text signal clicked
V následující části kódu se dostáváme k první zajímavé a pro naše tlačítko nejdůležitější části. Definici jeho vlastností a signálu jako reakci na stisk tlačítka. Na prvním řádku je klasická definice vlastnosti – pomocí klíčového slova property, následovaného typem vlastnosti a názvem vlastnosti. Za dvojtečkou se nachází výchozí hodnota vlastnosti – v našem případě tedy (pokud neuvedeme jinou barvu) bude tlačítko červené. Druhá vlastnost je takzvaný alias na vlastnost jiného prvku. Místo typu se za klíčovým slovem property objevuje další klíčkové slovo alias a za dvojtečkou se pak nachází odkaz na zástupnou vlastnost jiného prvku. Čtení a zápis na takto zástupné vlastnosti se automaticky projeví na čtení a zápisu v odkazované vlastnosti daného prvku. V našem případě prvku label a jeho vlastnosti text (ten si nadefinujeme později).
Dále nás zajímá definice signálu – v našem případě bez parametrů, které je možné jinak uvést v závorce (každý parametr musí být nějakého typu).
gradient: Gradient { GradientStop { position: 0.0; color: buttonColor } GradientStop { position: 1.0; color: Qt.darker(buttonColor, 2.0) } }
Pro pozadí tlačítka (tedy výplni prvku container) použijeme barevný přechod z barvy určené naší vlastností buttonColor na její tmavší variantu – za použítí vestavěné funkce darker objektu Qt. Pokud by nám stačila jednobarevná výplň, mohli bychom opět na barvu pozadí použít alias vlastnosti.
Text { id: label anchors.centerIn: parent; color: "white" }
A dostáváme se k textu tlačítka, na který jsme si výše připravili alias buttonText. Pro naše účely tedy stačí nastavit id na stejnou hodnotu jako v aliasu (label). Všimněte si, že vůbec nenastavujeme hodnotu vlastnosti text. Ta se nastaví právě přes alias. Pouze vycentrujeme text na střed tlačítka a nastavíme jeho barvu na bílou.
MouseArea { anchors.fill: parent onClicked: container.clicked() } }
Zbývá poslední krok – naučit naše tlačítko naslouchat příkazům uživatele. Opět použijeme již představený element MouseArea, který roztáhneme na celé naše tlačítko (vlastnost anchors.fill). A nadefinujeme reakci na jeho signál onClicked. Tedy signál, který reaguje na stisk tlačítka myši (či dotek na dotykovém zařízení) a jako akci vyšleme náš vlastní signál clicked bez parametrů.
Tímto jsme si vytvořili naše první komponentu – tlačítko. Nezbývá než se potěšit výsledkem a tlačítko použít v aplikaci. První tlačítko bude ve výchozí podobě červené (vizte výchozí vlastnost) a druhému nastavíme vlastnost buttonColor na zelenou barvu a bude tedy zelené. Při kliknutí se do konzole vypíše buď „Ahoj“ nebo „Hi“ v závislosti na stisknutém tlačítku.
import QtQuick 1.1 Row { width: 210; height: 40; spacing: 5 Button { buttonText: "Ahoj"; onClicked: console.log("Ahoj") } Button { buttonText: "Hi"; buttonColor: "Green"; onClicked: console.log("Hi") } }
V následujícím dílu seriálu se podíváme na funkcionalitu, která dělá moderní uživatelské rozhraní (a to někdy k nelibosti některých uživatelů) moderní – na animace. Ty nás pak přivedou ke stavům a přechodům.
Ano, kdyz prestanou na Qt delat, tak bude asi pro komunitu tezke spravovat takovy obri balik, ale...To je v podstate to, co jsem myslel. Obavam se, ze ciste komunitne spravovane Qt bez podpory komercni firmy s placenymi vyvojari na pozadi, urcujici nejaky smer a garantujici predvidatelny rozvoj, bude uplne jiny projekt a rada firem kupujicich licencovanou verzi zacne hledat jinou cestu. Nemyslim, ze Nokia nebude Qt rozvijet, otazka zni jak rychle - tedy kolik do toho investuje - a kam to bude smerovat, pomaly nejisty rozvoj je ta nejhorsi cesta a uprimne pokud vlastnikem bude Nokia s nejasnou motivaci, bude tato otazka stale ve vzduchu. V soucasne dobe bych do noveho produktu postaveneho na Qt jiz nesel, lepsi napsat v cistem C++, platforme zavisle casti izolovat a resit nativne.
V soucasne dobe bych do noveho produktu postaveneho na Qt jiz nesel, lepsi napsat v cistem C++, platforme zavisle casti izolovat a resit nativne.Platforme zavisla cast je v dnesni dobe skoro vsechno, takze dobrou chut
Qt funguje skoro na všech majoritních platformách.To je ono, skoro funguje.
Tak komercni vyvoj dela Digia, necekam, 4.8.1 delali prakticky oni, vcetne release.Vim, mame od nich Qt Commercial SDK, pouzivany na Ångström, tam to budem pouzivat asi dal, ne vsak na desktopu.
Motivace Nokie jsou mobilni aplikaceA postavene na Qt?
Gtk 4 co jsem slysel hodne omezi podporu ne-linux platforem,Gtk4 ? Co se o tom vi?
Postavene na Qt - ano, proc jinak by to Nokia delala. Jinak by cele Qt dala pryc uz davno.Ze setrvacnosti, backup plan? I kdyz vim, ze to interne v Berline pouzivaji.
Nedavno dokonce rikal Lars Knoll (na FOSDEMu), ze je to kvuli footprintu jeste porad malo rozdelene.To chvalim, footprint a nutna velikost flashe byl zatim jeden z hlavnich duvodu proc Qt nepouzit.
Asi nezrusi uplne podporu, jen bude hodne osekana, pripadne bokem.No dobre .... ale zrusit GIMP pro Windows?! ...
Celé jsem to buď nepochopil, nebo furt nemůžu najít tu killer featuru, která dělá z QML něco použitelného...přesně tohle řeším už pekelně dlouho. Navíc mám pocit, že jakmile někde uvedou, že "s tímhle budou skvělě pracovat designéři", tak je to automaticky krok do slepé uličky - vizte např. Zope (DTML vs. TPL), všelijaké PHP templaty, Django templaty... vždycky se s tím serou stejní lidé jako předtím, akorát, že je tam vrstva navíc.
Ono mi to občas přijde celé takové podivné. Tlačí se technologie, která umí v základu zobrazit pár základních tvarů, byť "dobře" konfigurovatelných. Hlavně že to umí částicové efekty. To je fakt potřeba.Nevim no, videl jsi treba QtMediaHub? Pokud si delal nejake podobne UI v C/C++ tak asi vis jaky to je maras, nemluve o tom, jaky maras to je aby to dobre vypadalo a chovalo se to stejne na Win/Linux/OSX. Pomoci QML se da udelat celkem zabijacke UI skoro bez prace a vicemene ciste, temer bez chyb (chyby jsou vetsinou v C/C++ backendu, v UI minimum). Proto QML pouzivam a to UX bytostne nesnasim, konzole-ole! :) Ano, tento tutorial sice ukazuje zakladni kameny a neodkryva naplno moznosti QML, ale to je holt udel tutorialu. Kazdopadne kdo ma predstavivost, tak i z techto zakladu pochopi jak mocny nastroj QML je. Pokud ne, je to ciste jeho problem :)
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.