Стиль Imagine

Добавлено 22 марта 2022 в 22:54

Одна из целей Qt Quick Controls – отделить логику элемента управления от его внешнего вида. Для большинства стилей реализация внешнего вида состоит из сочетания кода QML и графических ресурсов. Однако, используя стиль Imagine, можно настроить внешний вид приложения на основе Qt Quick Controls, используя только графические ресурсы.

Стиль Imagine основан на изображениях с 9 патчами (9-patch images). Это позволяет изображениям нести информацию о том, как они растянуты, и какие части следует считать частью элемента, а какие снаружи (например, тень). Для каждого элемента управления данный стиль поддерживает несколько элементов, и для каждого элемента доступно большое количество состояний. Предоставляя ресурсы для определенных комбинаций этих элементов и состояний, вы можете детально управлять внешним видом каждого элемента управления.

Подробная информация об изображениях с 9 патчами и о том, как можно стилизовать каждый элемент управления, подробно описана в документации по стилю Imagine. Здесь мы создадим собственный стиль для интерфейса воображаемого устройства, чтобы продемонстрировать, как этот стиль используется.

Стиль приложения настраивает элементы управления ApplicationWindow и Button. Для кнопок обрабатывается нормальное состояние, а также состояния «нажато» (pressed) и «отмечено» (checked). Демонстрационное приложение показано ниже.

Демонстрационное приложение

Код использует элемент столбца, Column, для кликабельных кнопок и элемент сетки, Grid, для отмечаемых. Кликабельные кнопки также растягиваются по ширине окна.

import QtQuick
import QtQuick.Controls

ApplicationWindow {

    // ...

    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Column {
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.margins: 10

        width: parent.width/2

        spacing: 10

        // ...

        Repeater {
            model: 5
            delegate: Button {
                width: parent.width
                height: 70
                text: qsTr("Click me!")
            }
        }
    }

    Grid {
        anchors.top: parent.top
        anchors.right: parent.right
        anchors.margins: 10

        columns: 2

        spacing: 10

        // ...

        Repeater {
            model: 10

            delegate: Button {
                height: 70
                text: qsTr("Check me!")
                checkable: true
            }
        }
    }
}

Поскольку мы используем стиль Imagine, все элементы управления, которые мы хотим использовать, должны быть оформлены с использованием графических ресурсов. Самый простое из этого – это фон для ApplicationWindow. Это однопиксельная текстура, определяющая цвет фона. Назовем этот файл applicationwindow-background.png, а затем укажем на него стилю с помощью файла qtquickcontrols2.conf, после чего данный файл будет подхвачен.

В файле qtquickcontrols2.conf, показанном ниже, вы можете увидеть, как мы установили Style в значение Imagine, а затем настроили путь, Path, для стиля, где он может искать ресурсы. Наконец, мы также устанавливаем некоторые свойства палитры. Доступные свойства палитры можно найти на странице QML Basic Type.

[Controls]
Style=Imagine

[Imagine]
Path=:images/imagine

[Imagine\Palette]
Text=#ffffff
ButtonText=#ffffff
BrightText=#ffffff

Ресурсы для элемента управления Button – это button-background.9.png, button-background-pressed.9.png и button-background-checked.9.png. Их имена следуют шаблону «элемент_управления-состояние». Файл без состояния, button-background.9.png, используется для всех состояний без определенного ресурса. Согласно справочной таблице элементов стиля Imagine, кнопка может находиться в следующих состояниях:

  • disabled
  • pressed
  • checked
  • checkable
  • focused
  • highlighted
  • flat
  • mirrored
  • hovered

Необходимые состояния зависят от вашего пользовательского интерфейса. Например, стиль hovered (когда над элементом находится курсор) никогда не используется для сенсорных интерфейсов.

кнопка

Глядя на увеличенную версию button-background-checked.9.png выше, вы можете увидеть по краям направляющие линии 9 патчей. Фиолетовый фон был добавлен для наглядности. Эта область в ресурсе, используемом в примере, на самом деле прозрачна.

Пиксели по краям изображения могут быть белыми/прозрачными, черными или красными. Эти цвета имеют разные значения, которые мы рассмотрим один за другим.

  • Черные линии вдоль левой и верхней сторон ресурса отмечают растягиваемые части изображения. Это означает, что закругленные углы и белый маркер в примере не изменяются при растяжении кнопки.
  • Черные линии вдоль правой и нижней сторон ресурса отмечают область, используемую для содержимого элемента управления. Это означает часть кнопки, которая используется для текста в примере.
  • Красные линии вдоль правой и нижней сторон ресурса отмечают области вставки. Эти области являются частью изображения, но не считаются частью элемента управления. Для изображения выше это используется для мягкого ореола, выходящего за пределы кнопки.

Демонстрация использования области вставки показана в button-background.9.png (ниже) и button-background-checked.9.png (выше): кажется, что изображение светится, но не двигается.

кнопка

Теги

9-patch images / изображениях с 9 патчамиGUI / Графический интерфейс пользователяQMLQtQtQuickQtQuick ControlsПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.