Akcie
Urobenie našej aplikácie užitočnou
Máme okno, máme karty a máme akcie. No stále musíme nájsť nejaký spôsob zadávania mena, popisu a dátumu podľa nášho výberu.
Jedným spôsobom, ako to urobiť, by bolo vytvorenie novej stránky, kde umiestnime požadované vstupné prvky. Avšak celá stránka venovaná poskytovaniu mena, popisu a dátumu sa zdá trochu prehnané.
Namiesto toho budeme používať dialóg.

Otvorenie dialógu
pageStack.initialPage: Kirigami.ScrollablePage {
// ...
actions: [
Kirigami.Action {
id: addAction
icon.name: "list-add"
text: i18nc("@action:button", "Add kountdown")
onTriggered: addDialog.open()
}
]
}Najprv upravíme akciu z predchádzajúceho tutoriálu: len Kirigami.Action, ktorá spúšťa funkciu open() dialógu.
Dialógy na pridávanie odpočítavania
Nový komponent, ktorý pridávame, je Kirigami.Dialog. Dialógy sa zobrazujú v strede okna a dajú sa použiť na poskytnutie ďalších informácií relevantných pre aktuálny obsah. Nedajú sa presúvať, ale prispôsobujú svoju vlastnú veľkosť oknu.
Kirigami.ApplicationWindow {
// ...
Kirigami.Dialog {
id: addDialog
title: i18nc("@title:window", "Add kountdown")
standardButtons: Kirigami.Dialog.Ok | Kirigami.Dialog.Cancel
padding: Kirigami.Units.largeSpacing
preferredWidth: Kirigami.Units.gridUnit * 20
// Rozloženia formulárov pomáhajú zarovnať a štrukturovať rozloženie s viacerými vstupmi
Kirigami.FormLayout {
// Textové polia vám umožňujú zadávať text v tenkom textovom poli
Controls.TextField {
id: nameField
// Poskytuje štítok pripojený k textovému poľu
Kirigami.FormData.label: i18nc("@label:textbox", "Name*:")
// Čo robiť po prijatí vstupu (t.j. stlačení Enter). V tomto prípade presunie
// zameranie na ďalšie pole
onAccepted: descriptionField.forceActiveFocus()
}
Controls.TextField {
id: descriptionField
Kirigami.FormData.label: i18nc("@label:textbox", "Description:")
placeholderText: i18n("Optional")
// Opäť presunie zameranie na ďalšie pole
onAccepted: dateField.forceActiveFocus()
}
Controls.TextField {
id: dateField
Kirigami.FormData.label: i18nc("@label:textbox", "ISO Date*:")
// D znamená povinné číslo medzi 1-9, 9 znamená povinné číslo medzi 0-9
inputMask: "D999-99-99"
// Tu potvrdíme operáciu rovnako ako kliknutím na tlačidlo OK
onAccepted: addDialog.onAccepted()
}
Controls.Label {
text: "* = required fields"
}
}
// Tu sa nachádza logika dialógu
}
// ...
}Dialógy majú predvolene hlavičku a pätu, obe zdedené z Controls.Dialog.
Hlavička predvolene obsahuje nadpis a tlačidlo na zatvorenie, ktoré sa dá deaktivovať pomocou showCloseButton. Päta predvolene obsahuje tlačidlo na zatvorenie a dá sa prepísať pomocou standardButtons.
Najprv ho nastavíme na zobrazenie tlačidla "Ok" a tlačidla "Cancel", pridáme nejaké odsadenie a pridáme rozumnú preferredWidth. Preferovaná šírka je predvolená očakávaná veľkosť dialógu, ktorá sa môže v prípade potreby zväčšiť. Môžeme použiť štandardné Kirigami.Units, ku ktorým sa neskôr vrátime.
Potom sa dostávame k Kirigami.FormLayout. Na rozdiel od ColumnLayout je rozloženie jeho potomkovských komponentov automatické a vycentrované s voliteľnými popiskami. Ako názov napovedá, používa sa na vytváranie vstupných formulárov.
Tieto rozloženia formulárov sú navrhnuté na prácu s rôznymi typmi vstupov, aj keď my sa držíme jednoduchých vstupov Controls.Textfield, ktoré nám dávajú jednoduché textové polia na písanie.
Vytvorili sme elementy Textfield, ktoré fungujú ako:
- Vstup pre názov nášho odpočítavania
- Vstup pre popis nášho odpočítavania
- Vstup pre dátum, ku ktorému odpočítavame, ktorý musí byť zadaný vo formáte
YYYY-MM-DD
V každom z týchto prvkov Controls.Textfield nastavujeme vlastnosť Kirigami.FormData.label, ktorá nám umožňuje definovať popisky pre ne. Formulár zobrazí správne popisky naľavo od každého z týchto textových vstupných polí.
Nakoniec tiež nastavujeme vlastnosť onAccepted na spustenie metódy forceActiveFocus() nasledujúceho poľa; toto prepne aktívne pole, keď používateľ stlačí kláves ENTER, čím sa zlepší použiteľnosť formulára.
Nastavili sme tiež vlastnosť inputMask na textovom poli pre náš dátum. Nastavenie na D999-99-99 bráni používateľom zadať niečo, čo by mohlo narušiť funkčnosť aplikácie (ako text), obmedzujúc ich na zadávanie iba číslic, ktoré potom môžeme skúsiť analyzovať na objekt dátumu.
Keď je používateľské rozhranie dialógu hotové, musíme zmeniť, ako sa správa. Na to potrebujeme tri veci:
- Zobraziť tlačidlo Ok iba keď sú vyplnené povinné polia
- Pridať vstupné informácie do modelu
- Vyčistiť vstupný formulár
Kirigami.Dialog {
// ... Keď je Kirigami.Dialog inicializovaný, chceme vytvoriť vlastné prepojenie, aby bolo
// tlačidlo Ok viditeľné iba ak sú vyplnené požadované textové polia. Na to používame
// Kirigami.Dialog.standardButton(button):
Component.onCompleted: {
const button = standardButton(Kirigami.Dialog.Ok);
// () => je šípková funkcia JavaScriptu
button.enabled = Qt.binding( () => requiredFieldsFilled() );
}
onAccepted: {
// Prepojenie je vytvorené, ale stále musíme urobiť tlačidlo neklikateľným, pokiaľ nie sú
// polia vyplnené
if (!addDialog.requiredFieldsFilled()) return;
appendDataToModel();
clearFieldsAndClose();
}
}Prvá vec, ktorú musíme urobiť, je vytvoriť prepojenie medzi vlastnosťou enabled tlačidla OK a kontrolou, či sú polia vyplnené, čo v tomto prípade musí byť vykonané pomocou Qt.binding() v JavaScripte. V skutočnosti riadok:
button.enabled = Qt.binding( () => requiredFieldsFilled() );je podobný previazaniam QML, ktoré sme doteraz videli, ako v nasledujúcom pseudokóde:
enabled: requiredFieldsFilled()Obsluha signálu, ktorá spúšťa tlačidlo Ok, je onAccepted. Zostáva prázdna a bez činnosti, ak sú vyplnené požadované polia; inak pridá vstup do modelu a vyčistí dialóg pre ďalšie otvorenie.
Kirigami.Dialog {
// ... Kontrolujeme, že nameField nie je prázdne a že dateField (ktoré má inputMask) je úplne
// vyplnené
function requiredFieldsFilled() {
return (nameField.text !== "" && dateField.acceptableInput);
}
function appendDataToModel() {
kountdownModel.append({
name: nameField.text,
description: descriptionField.text,
date: new Date(dateField.text)
});
}
function clearFieldsAndClose() {
nameField.text = ""
descriptionField.text = ""
dateField.text = ""
addDialog.close();
}
}Pre naše povinné pole názvu stačí skontrolovať, či je text poľa prázdny reťazec. Pre pole dátumu, pretože má masku vstupu, musíme namiesto toho použiť acceptableInput, ktoré sa stane pravdivým iba vtedy, keď je celé pole vyplnené a obsahuje iba prijateľné znaky.
Potom metóda append() nášho modelu zoznamu kountdownModel pridá objekt JavaScript obsahujúci vlastnosti, ktoré sme poskytli.
Nakoniec sa uistíme, že vyčistíme textové polia nastavením ich vlastností text na prázdny reťazec, a potom dialóg zavrieme.
Keď uložíme naše súbory a zostavíme náš program, budeme schopní pridávať vlastné odpočítavania! Môžeme urobiť poslednú úpravu na zlepšenie rozhrania, konkrétne odstrániť figurantské odpočítavanie, ktoré sme mali v predchádzajúcich lekciách:
| |
Po druhé, teraz keď máme skutočný dátum, s ktorým môžeme pracovať, môžeme vypočítať čas do tohto dátumu:
| |
A po tretie zväčšiť veľkosť okna, aby sme mali viac priestoru pre naše nové karty:
| |
Oveľa lepšie.
Naša aplikácia doteraz
Main.qml:
| |
