Overlay-vellen aanmaken

Grip krijgen op overlay-vellen.

Uw toepassing nuttig maken

We hebben een venster, we hebben kaarten en we hebben acties. Nu moeten we nog steeds een manier vinden voor het invoeren van een naam, beschrijving en datum van uw keuze.

Een manier waarop we dit zouden kunnen doen is met het maken van een nieuwe pagina waar we de vereiste invoerelementen in plaatsen. Een gehele pagina bestemd om een naam, beschrijving en datum te leveren lijkt een beetje teveel.

In plaats daarvan zullen we een overlay-vel gebruiken.

Overlay-vel die verschijnt in het midden van de toepassing zoals een dialoogvenster

Aftelvel

De nieuwe component die we toevoegen is Kirigami.OverlaySheet . Overlay-vellen zweven boven de inhoud van het venster en kunnen gebruikt worden voor een variëteit van doelen, zoals extra informatie leveren relevant voor de huidige inhoud. Ze zijn fancy pop-up vensters, behalve dat ze niet verplaatst kunnen worden.

Kirigami.OverlaySheet {
    id: addSheet
    header: Kirigami.Heading {
        text: i18nc("@title:window", "Add kountdown")
    }
    Kirigami.FormLayout {
        Controls.TextField {
            id: nameField
            Kirigami.FormData.label: i18nc("@label:textbox", "Name:")
            placeholderText: i18n("Event name (required)")
            onAccepted: descriptionField.forceActiveFocus()
        }
        Controls.TextField {
            id: descriptionField
            Kirigami.FormData.label: i18nc("@label:textbox", "Description:")
            placeholderText: i18n("Optional")
            onAccepted: dateField.forceActiveFocus()
        }
        Controls.TextField {
            id: dateField
            Kirigami.FormData.label: i18nc("@label:textbox", "Date:")
            placeholderText: i18n("YYYY-MM-DD")
            inputMask: "0000-00-00"
        }
        Controls.Button {
            id: doneButton
            Layout.fillWidth: true
            text: i18nc("@action:button", "Done")
            enabled: nameField.text.length > 0
            onClicked: {
                kountdownModel.append({
                    name: nameField.text,
                    description: descriptionField.text,
                    // De methode parse() ontleedt een tekenreeks en geeft het aantal milliseconden
                    // terug sinds 1 januari 1970, 00:00:00 UTC.
                    date: Date.parse(dateField.text)
                });
                nameField.text = ""
                descriptionField.text = ""
                dateField.text = ""
                addSheet.close();
            }
        }
    }
}

We kunnen overlay-vellen een kop geven. Deze worden gezet met de eigenschap header . We hebben de onze van een Kirigami.Heading voorzien die een relevante titel bevat: "Kountdown toevoegen".

Daarna komen we bij een Kirigami.FormLayout . Dit biedt ons het gemakkelijk aanmaken van snel reagerende invoerformulieren, die netjes labels voor invoer tonen en de invoervelden zelf op zowel brede schermen als smallere mobiele apparaten. Deze formulierindelingen zijn ontworpen om te werken met een variëteit van verschillende invoertypen, hoewel we blijven bij eenvoudige Controls.Textfield invoer die ons eenvoudige tekstvelden geeft om dingen in te schrijven.

We hebben elementen Textfield gemaakt die acteren als:

  1. Invoer voor de naam van onze aftelling
  2. Invoer voor de beschrijving van onze aftelling
  3. Invoer voor de datum waar we naar aftellen, die geleverd moet worden in een formaat JJJJ-MM-DD.

Binnen elk van deze elementen Controls.Textfield zetten we een eigenschap Kirigami.FormData.label die ons labels voor hen laat definiëren. Het formulier zal de juiste labels voor elk van deze tekstinvoer presenteren. We zetten ook plaatshoudertekst in de velden met de eigenschap TextField.placeholderText, die zal verdwijnen zodra de gebruiker in het veld begint te typen. Tenslotte zetten we ook de eigenschap onAccepted om de methode forceActiveFocus() te starten van het volgende veld; dit schakelt het actieve veld in wanneer de gebruiker de toets ENTER indrukt, waarmee de bruikbaarheid van ons formulier wordt verbeterd.

We hebben ook een eigenschap genaamd inputMask ingesteld op het tekstveld voor onze datum. Dit instellen op "0000-00-00" voorkomt dat gebruikers iets invoeren dat de functionaliteit van de toepassing laat breken (zoals tekst), die hen beperkt tot het alleen invoeren van cijfers die we daarna kunnen proberen te ontleden in een datum object.

Aan het eind van ons formulier voegen we een Button in die onze nieuwe aftelling toevoegt aan het lijstmodel. We hebben de eigenschap enabled ingesteld op een voorwaardelijk statement dat controleert of het naamveld leeg is of niet: zo ja, dan is de knop uitgeschakelde en vice versa. Wanneer de knop wordt bediend, start het de methode append van ons lijstmodel kountdownModel, waarmee een Javascript object inclusief de eigenschappen die we hebben geleverd wordt toegevoegd. We zorgen er voor dat de tekstvelden gewist worden door hun eigenschappen text op een lege tekenreeks worden ingesteld. Tenslotte roepen we een methode op ons overlay-vel aan, close() , die het sluit.

Ons vel gebruiken

actions.main: Kirigami.Action {
    id: addAction
    icon.name: "list-add"
    text: i18nc("@action:button", "Add kountdown")
    onTriggered: addSheet.open()
}

Overlay-vellen hebben twee methoden, open() en close() die het openen en sluiten van deze component besturen. In dit geval hebben we het vel ingesteld om te openen wanneer onze actie wordt gestart. Nadat we onze bestanden hebben opgeslagen en ons programma hebben gebouwd, zijn we in staat om onze eigen aangepaste aftellingen toe te voegen!

Onze toepassing (app) tot zover

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import QtQuick 2.15
import QtQuick.Controls 2.15 as Controls
import QtQuick.Layouts 1.15
import org.kde.kirigami 2.20 as Kirigami

Kirigami.ApplicationWindow {
    id: root

    title: i18nc("@title:window", "Day Kountdown")

    globalDrawer: Kirigami.GlobalDrawer {
        isMenu: true
        actions: [
            Kirigami.Action {
                text: i18n("Quit")
                icon.name: "gtk-quit"
                shortcut: StandardKey.Quit
                onTriggered: Qt.quit()
            }
        ]
    }

    ListModel {
        id: kountdownModel
    }

    Component {
        id: kountdownDelegate
        Kirigami.AbstractCard {
            contentItem: Item {
                implicitWidth: delegateLayout.implicitWidth
                implicitHeight: delegateLayout.implicitHeight
                GridLayout {
                    id: delegateLayout
                    anchors {
                        left: parent.left
                        top: parent.top
                        right: parent.right
                    }
                    rowSpacing: Kirigami.Units.largeSpacing
                    columnSpacing: Kirigami.Units.largeSpacing
                    columns: root.wideScreen ? 4 : 2

                    Kirigami.Heading {
                        Layout.fillHeight: true
                        level: 1
                        text: i18n("%1 days", Math.round((date-Date.now())/86400000))
                    }

                    ColumnLayout {
                        Kirigami.Heading {
                            Layout.fillWidth: true
                            level: 2
                            text: name
                        }
                        Kirigami.Separator {
                            Layout.fillWidth: true
                            visible: description.length > 0
                        }
                        Controls.Label {
                            Layout.fillWidth: true
                            wrapMode: Text.WordWrap
                            text: description
                            visible: description.length > 0
                        }
                    }
                    Controls.Button {
                        Layout.alignment: Qt.AlignRight
                        Layout.columnSpan: 2
                        text: i18n("Edit")
                    }
                }
            }
        }
    }

    // Overlay sheets appear over a part of the window
    Kirigami.OverlaySheet {
        id: addSheet
        header: Kirigami.Heading {
            text: i18nc("@title:window", "Add kountdown")
        }
        // Form layouts help align and structure a layout with several inputs
        Kirigami.FormLayout {
            // Textfields let you input text in a thin textbox
            Controls.TextField {
                id: nameField
                // Provides label attached to the textfield
                Kirigami.FormData.label: i18nc("@label:textbox", "Name:")
                // Placeholder text is visible before you enter anything
                placeholderText: i18n("Event name (required)")
                // What to do after input is accepted (i.e. pressed enter)
                // In this case, it moves the focus to the next field
                onAccepted: descriptionField.forceActiveFocus()
            }
            Controls.TextField {
                id: descriptionField
                Kirigami.FormData.label: i18nc("@label:textbox", "Description:")
                placeholderText: i18n("Optional")
                onAccepted: dateField.forceActiveFocus()
            }
            Controls.TextField {
                id: dateField
                Kirigami.FormData.label: i18nc("@label:textbox", "Date:")
                placeholderText: i18n("YYYY-MM-DD")
                inputMask: "0000-00-00"
            }
            Controls.Button {
                id: doneButton
                Layout.fillWidth: true
                text: i18nc("@action:button", "Done")
                // Button is only enabled if the user has entered something into the nameField
                enabled: nameField.text.length > 0
                onClicked: {
                    // Add a listelement to the kountdownModel ListModel
                    kountdownModel.append({
                        name: nameField.text,
                        description: descriptionField.text,
                        date: Date.parse(dateField.text)
                    });
                    nameField.text = ""
                    descriptionField.text = ""
                    dateField.text = ""
                    addSheet.close();
                }
            }
        }
    }

    pageStack.initialPage: Kirigami.ScrollablePage {
        title: i18nc("@title", "Kountdown")

        // Kirigami.Action encapsulates a UI action. Inherits from Controls.Action
        actions.main: Kirigami.Action {
            id: addAction
            // Name of icon associated with the action
            icon.name: "list-add"
            // Action text, i18n function returns translated string
            text: i18nc("@action:button", "Add kountdown")
            // What to do when triggering the action
            onTriggered: addSheet.open()
        }

        Kirigami.CardsListView {
            id: layout
            model: kountdownModel
            delegate: kountdownDelegate
        }
    }
}

Schermafdruk van de toepassing met vier voorbeeldkaarten