Работа с делегатами

Функциональные возможности использования делегатов в пользовательских интерфейсах приложений
Banner

ItemDelegate

Многофункциональный элемент используется в разнообразных списках. По сути, это панелька с иконкой, основным и дополнительным надписями и индикатором. Содержит разделитель, свойства isFirst и isLast для декорации элементов в начале и конце списка.

# основная надпись

text

font

color



# вторичная надпись

subText

subFont

subColor



icon.source # ресурс иконки

isFirst: false # отметка первой в списке записи

isLast: false # отметка последней в списке записи

showSeparator: !isLast # отображение разделителя

indicatorSource # иконка индикатора (по умолчанию стрелка вправо)

showIndicator: false # отображение индикатора (иконка в правой части компонента)

backgroundColor: Rosa.Theme.bgColor # цвет фона

bool wrapText: false

bool elideText: true

showPressedEffect: true

Пример

Три компонента располагаются в Column; такое расположение типично, например, для списка настроек или Menu. Здесь напрямую устанавливаются isFirst и isLast, что скругляет углы фигуры и влияет на отображение разделителя.

Column {

    width: parent.width

    spacing: 0



    ItemDelegate {

        width: parent.width

        text: i18n("Item 1")

        subText: i18n("SubText")

        showIndicator: true

        isFirst: true

        icon.source: Rosa.Theme.icon('24/week-filled-color')

    }



    ItemDelegate {

        width: parent.width

        text: i18n("Item 2")

        subText: i18n("SubText")

        showIndicator: true

        icon.source: Rosa.Theme.icon('24/week-filled-color')

    }



    ItemDelegate {

        width: parent.width

        text: i18n("Item 3")

        subText: i18n("SubText")

        showIndicator: true

        isLast: true

        icon.source: Rosa.Theme.icon('24/week-filled-color')

    }

}
Item Delegate Light
Item Delegate Dark

Пример со списком ListView

ListView {

    id: listView

    width: parent.width

    height: contentHeight

    clip: true

    model: 3



    delegate: ItemDelegate {

        width: ListView.view.width

        text: i18n("Text")

        subText: i18n("SubText") + "  " + (isFirst ? "isFirst" : isLast ? "isLast" : "")

        isFirst: index === 0

        isLast: index === ListView.view.count - 1

        showIndicator: true

        icon.source: Rosa.Theme.icon('24/week-filled-color')

    }

}
Item Delegate List Light
Item Delegate List Dark

Пример кастомизации

ItemDelegate {

    width: parent.width

    text: i18n("Checkable")

    subText: i18n("SubText")

    color: "red"

    subColor: "green"

    showSeparator: false

    showIndicator: true

    indicatorSource: Rosa.Theme.icon(checked ? 'checkbox-small-active' : 'checkbox-small')

    icon.source: Rosa.Theme.icon('24/week-color')

    checkable: true

}
Item Delegate List Light
Item Delegate List Dark

CheckDelegate

Поле выбора основано на ItemDelegate.

SettingsContainer {

    width: parent.width



    CheckDelegate {

        width: parent.width

        text: i18n("Preset 1")

    }



    CheckDelegate {

        width: parent.width

        text: i18n("Preset 2")

    }



    CheckDelegate {

        width: parent.width

        text: i18n("Preset 3")

        showSeparator: false

    }

}
Check Delegate Light
Check Delegate Dark

ChipDelegate

Компонент содержит список Chip (кнопка) элементов с возможностью мультивыбора. Логика работы со списками аналогична ItemDelegate.

# основная надпись

text

font

color



bool isRadioGroup: false # режим эксклюзивного выбора

var checkedIndexes: [] # список выбранных элементов

int checkedIndex: checkedIndexes.length > 0 ? control.checkedIndexes[0] : -1

var model # QML model для создания списка, поддерживаются текстовые данные



# по аналогии с ItemDelegate

bool isFirst: false

bool isLast: false

bool showSeparator: !isLast



# снимает выбор с элементов

function clear()

Пример с мультивыбором

ChipsDelegate {

    id: delegate

    width: parent.width

    text: i18n("isFirst")

    model: ["One", "Two", "Three"]

    icon.source: Rosa.Theme.icon('24/week-dark')

    isFirst: true

}
Chip Delegate Light
Chip Delegate Dark

Пример с Radio

Если список Chip выходит за область элемента, то эту область можно прокручивать по горизонтали.

ChipsDelegate {

    id: delegateRadio

    width: parent.width

    text: i18n("isRadioGroup isLast")

    model: ["One", "Two", "Three", "One", "Two", "Three", "One", "Two", "Three"]

    isRadioGroup: true

    isLast: true

}
Radio Delegate Light
Radio Delegate Dark

SwitchDelegate

Компонент – переключатель, адаптирован для работы с асинхронным кодом: сначала мы указываем, куда хотим переключить, а потом из данных поступает реальный ответ — переключились или нет.

bool value # сюда устанавливается реальный результат переключения

bool updating # пока желаемое не равно реальным данным

bool autoFreezing: false # блокировка элемента на переключение (по умолчанию - отключено)

int freezingTimeout: 1000 # задержка на блокировку переключения (анти спам)

bool wrapText: false # перенос текста

bool elideText: true # троеточие если текст не умещается

Component baseIcon # можно переопределить компонент иконки



# сигнал выдает "пожелание" пользователя переключиться, используй всегда, как и value

signal checkedUpdated(bool checked)



# по аналогии с ItemDelegate

string text

font font

color color



string subText

font subFont

color subColor



bool isFirst: false

bool isLast: false

bool showSeparator: !isLast

Пример

SwitchDelegate {

    id: switcher

    width: parent.width

    text: i18n("Text colored")

    subText: i18n("SubText")

    color: "red"

    subColor: "green"

    showSeparator: false

    icon.source: Rosa.Theme.icon('24/week-color')



    value: asyncProcess.value # выставляем реальное значение



    # пользователь пожелал переключиться

    onCheckedUpdated: {

        asyncProcess.setupValue(checked)

    }

}
Switch Delegate Light
Switch Delegate Dark

RadioDelegate

Делегат с радиоиндикатором основан на ItemDelegate.

checkable: true

showIndicator: true

indicatorSource: Rosa.Theme.icon(checked ? 'radio-active' : 'radio')

Пример

ButtonGroup {

    buttons: blockRadio.children

    exclusive: true

}



Column {

    id: blockRadio

    width: parent.width

    spacing: 0



    RadioDelegate {

        width: parent.width

        text: i18n("Preset 1")

        isFirst: true

    }



    RadioDelegate {

        width: parent.width

        text: i18n("Preset 2")

    }



    RadioDelegate {

        width: parent.width

        text: i18n("Preset 3")

        isLast: true

    }

}
Radio Delegate Light
Radio Delegate Dark

SliderDelegate

Делегат со слайдером. Работа и вид подобны ItemDelegate.

alias slider: slider # доступ к объекту слайдера QML Slider



# по аналогии с ItemDelegate

string text

font font

color color



bool isFirst: false

bool isLast: false

bool showSeparator: !isLast

Пример

Значение слайдера устанавливается в лейбл делегата в виде real значения. Необходимые значения слайдера можно выставить через slider.

SliderDelegate {

    width: parent.width

    text: i18n("Default slider ") + ` (${slider.value.toFixed(2)})`

    color: "red"

    icon.source: Rosa.Theme.icon('24/week-filled-color')

    slider.from: 0.0

    slider.to: 1.0

    slider.stepSize: 0.02

}
Slider Delegate Light
Slider Delegate Dark

TextFieldDelegate

Поле для ввода текста. Работа и вид подобны ItemDelegate.

# управление заголовком

string title # по умолчанию заголовок видно если есть фокус или введенный текст (value)

font titleFont

color titleColor

bool holdTitle: false # заголовок будет виден всегда

bool digitsInput: false # влияет на вид виртуальной клавиатуры при вводе



string errorText # текст ошибки

bool showError: !!errorMessage



string placeholderText # текст - заглушка

alias value: textField.text # значение текста из элемента QML TextField



alias textField: textField # доступ к полю ввода

alias validator: textField.validator # доступ к проверке ввода



bool hideClearButton: textField.readOnly # можно скрыть кнопку очистки



# по аналогии с ItemDelegate

string text

font font

color color



bool isFirst: false

bool isLast: false

bool showSeparator: !isLast

Пример

Значение слайдера устанавливается в лейбл делегата в виде real значения. Необходимые значения слайдера можно выставить через slider.

ListView {

    id: listView

    width: parent.width

    height: contentHeight

    clip: true

    model: 3



    delegate: TextFieldDelegate {

        width: ListView.view.width

        placeholderText: i18n("Input text...")

        isFirst: index === 0

        isLast: index === ListView.view.count - 1

        icon.source: Rosa.Theme.icon('24/week-filled-color')

    }

}



TextFieldDelegate {

    width: parent.width

    placeholderText: i18n("Input text...")



    onValueChanged: myLabel.text = value

}



TextFieldDelegate {

    width: parent.width

    title: i18n("Name contact")

    placeholderText: i18n("Input text...")

}



TextFieldDelegate {

    width: parent.width

    title: i18n("Name contact (holdTitle)")

    holdTitle: true

    placeholderText: i18n("Input text...")

}
TextField Delegate Light
TextField Delegate Dark

PasswordFieldDelegate

Поле для ввода пароля основано на TextFieldDelegate.

bool hidePasswordButton # позволяет скрыть кнопку раскрытия пароля

Пример

Значение слайдера устанавливается в лейбл делегата в виде real значения. Необходимые значения слайдера можно выставить через slider.

PasswordFieldDelegate {

    width: parent.width

    errorMessage: isValidateFail ? passwordErrorMessage : ""

}



PasswordFieldDelegate {

    width: parent.width

    title: i18n("Пароль")

    holdTitle: true

    errorMessage: isValidateFail ? passwordErrorMessage : ""

}
Password Field Light
Password Field Dark

Поле ввода пароля

Password Title Light
Password Title Dark

Поле ввода пароля с заголовком

Password Error Light
Password Error Dark

Поле ввода пароля с текстом об ошибке