Простые преобразования в QML

Добавлено 3 марта 2022 в 02:14

Преобразование манипулирует геометрией объекта. Элементы QML, как правило, могут быть перемещены, повернуты и масштабированы. Существуют как простая форма этих операций, так и более продвинутый способ.

Начнем с простых преобразований. Вот наша сцена в качестве отправной точки.

сцена

Простое перемещение выполняется путем изменения положения x, y. Вращение выполняется с помощью свойства rotation. Значение для поворота предоставляется в градусах (0 .. 360). Масштабирование выполняется с использованием свойства scale, и значение <1 означает, что элемент будет уменьшен, а >1 означает, что элемент будет увеличен. Вращение и масштабирование не меняют геометрию элемента: x,y и width/height не изменяются; преобразуются только инструкции по отрисовке.

Прежде чем мы перейдем к примеру, я хотел бы представить небольшой помощник: элемент ClickableImage. ClickableImage – это просто изображение с областью обработки событий мыши. Это приводит к полезному практическому правилу: если вы скопировали фрагмент кода три раза, вынесите его в отдельный компонент.

// ClickableImage.qml
// Простое изображение, на которое можно кликнуть

import QtQuick

Image {
    id: root
    signal clicked

    MouseArea {
        anchors.fill: parent
        onClicked: root.clicked()
    }
}

Мы используем наше кликабельное изображение, чтобы представить три объекта (квадрат, круг, треугольник). Каждый объект выполняет простое преобразование при клике по нему. Клик по фону сбросит сцену в исходное состояние.

// transformation.qml

import QtQuick

Item {
    // установить ширину на основе заданного фона
    width: bg.width
    height: bg.height

    Image { // красивое фоновое изображение
        id: bg
        source: "assets/background.png"
    }

    MouseArea {
        id: backgroundClicker
        // должен быть перед изображениями, так как порядок
        // имеет значение, иначе эта область обработки событий
        // мыши будет перед другими элементами и будет
        // захватывать события мыши
        anchors.fill: parent
        onClicked: {
            // сбросить нашу маленькую сцену
            circle.x = 84
            box.rotation = 0
            triangle.rotation = 0
            triangle.scale = 1.0
        }
    }

    ClickableImage {
        id: circle
        x: 84; y: 68
        source: "assets/circle_blue.png"
        antialiasing: true
        onClicked: {
            // увеличить положение по x при клике
            x += 20
        }
    }

    ClickableImage {
        id: box
        x: 164; y: 68
        source: "assets/box_green.png"
        antialiasing: true
        onClicked: {
            // увеличить поворот при клике
            rotation += 15
        }
    }

    ClickableImage {
        id: triangle
        x: 248; y: 68
        source: "assets/triangle_red.png"
        antialiasing: true
        onClicked: {
            // несколько преобразований
            rotation += 15
            scale += 0.05
        }
    }
    
    // ...

Круг увеличивает позицию по оси x при каждом клике, а квадрат будет вращаться при каждом клике. Треугольник будет вращаться и увеличивать размер при каждом клике, чтобы продемонстрировать комбинированное преобразование. Для операции масштабирования и поворота мы устанавливаем antialiasing: true, чтобы включить сглаживание, которое по умолчанию отключено (так же, как свойство clip) из соображений производительности. В ваших собственных проектах, когда вы видите некоторые растеризованные края в своей графике, вам, вероятно, следует включить сглаживание.

Совет

Для достижения лучшего визуального качества при масштабировании изображений рекомендуется уменьшать, а не увеличивать масштаб. Масштабирование изображения с большим коэффициентом масштабирования приведет к артефактам масштабирования (размытому изображению). При масштабировании изображения следует использовать smooth: true, чтобы использовать более качественный фильтр за счет снижения производительности.

MouseArea фона покрывает весь фон и сбрасывает значения объектов в исходное состояние.

Совет

Элементы, которые появляются в коде раньше, имеют более низкий порядок размещения (называемый z-порядком). Если вы достаточно долго кликаете на круг (объект circle), вы увидите, что он перемещается под квадрат (объект box). z-порядком также можно управлять с помощью свойства z элемента.

Это потому, что элемент box появляется в коде позже. То же самое относится и к областям обработки событий мыши. Область обработки событий мыши, идущая в коде позже, будет перекрывать (и, таким образом, захватывать события мыши) области обработки событий мыши, идущую в коде раньше.

Помните: порядок элементов в документе имеет значение.

Теги

GUI / Графический интерфейс пользователяQMLQtQtQuickОбучениеПрограммирование

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

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