Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
develop:qt:quick2 [2021/08/23 18:05] admin |
develop:qt:quick2 [2021/08/31 15:21] (текущий) admin |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Qt Quick: Ввод, Анимация, Преставление, | + | ====== Qt Quick: |
Строка 6: | Строка 6: | ||
Можно использовать форматы: | Можно использовать форматы: | ||
+ | |||
=== Элемент Image === | === Элемент Image === | ||
Этот элемент отображает файл изображения, | Этот элемент отображает файл изображения, | ||
Строка 115: | Строка 115: | ||
</ | </ | ||
+ | |||
+ | === BorderImage === | ||
- | === BorderImage === | ||
- | ---- | ||
Элемент для нормального масштабирования графики, | Элемент для нормального масштабирования графики, | ||
Строка 134: | Строка 134: | ||
</ | </ | ||
+ | |||
==== Градиент ==== | ==== Градиент ==== | ||
---- | ---- | ||
Строка 166: | Строка 166: | ||
</ | </ | ||
+ | |||
==== Рисование Canvas ==== | ==== Рисование Canvas ==== | ||
---- | ---- | ||
Строка 255: | Строка 255: | ||
+ | |||
===== Пользовательский ввод ===== | ===== Пользовательский ввод ===== | ||
==== Область мыши ==== | ==== Область мыши ==== | ||
Строка 328: | Строка 328: | ||
</ | </ | ||
+ | |||
==== Сигналы ==== | ==== Сигналы ==== | ||
---- | ---- | ||
+ | Сигналы в QML это события, | ||
+ | Можно определять собственные сигналы: | ||
+ | **signal < | ||
+ | К каждому такому сигналу автоматически создастся соответствующий обработчик (слот), с префиксом **on**.\\ | ||
+ | Насколько я понимаю, | ||
< | < | ||
- | < | + | < |
<code QML> | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 300; height: 300; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | color: mousearea.containsMouse ? " | ||
+ | signal myMouseSignal(int x, int y) | ||
+ | onMyMouseSignal: | ||
+ | { | ||
+ | txt.text= "< | ||
+ | } | ||
+ | Text | ||
+ | { | ||
+ | id: txt | ||
+ | anchors.centerIn: | ||
+ | } | ||
+ | MouseArea | ||
+ | { | ||
+ | anchors.fill: | ||
+ | hoverEnabled: | ||
+ | onMouseXChanged: | ||
+ | onMouseYChanged: | ||
+ | } | ||
+ | } | ||
+ | } | ||
</ | </ | ||
</ | </ | ||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | // Файл button.qml | ||
+ | import QtQuick 2.0 | ||
+ | |||
+ | BorderImage | ||
+ | { | ||
+ | property alias text: txt.text | ||
+ | signal clicked; | ||
+ | source: " | ||
+ | width: txt.width +15 | ||
+ | height: txt.height +15 | ||
+ | border {left: 15; top: 12; right: 15; bottom: 15} | ||
+ | Text | ||
+ | { | ||
+ | id: txt | ||
+ | color: " | ||
+ | anchors.centerIn: | ||
+ | } | ||
+ | MouseArea | ||
+ | { | ||
+ | anchors.fill: | ||
+ | onClicked: parent.clicked(); | ||
+ | onPressed: parent.source= " | ||
+ | onReleased: parent.source= " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Основной файл | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 150; height: 100; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Button | ||
+ | { | ||
+ | anchors.centerIn: | ||
+ | text: "Click this" | ||
+ | onClicked: text= " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Ввод с клавиатуры ==== | ||
+ | ---- | ||
+ | В основном ввод с клавиатуры обрабатывается двумя элементами: | ||
+ | Размер элемента будет соответствовать введенному тексту, | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: txt.width + 20; height: 100; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | TextInput | ||
+ | { | ||
+ | id: txt | ||
+ | anchors.centerIn: | ||
+ | color: " | ||
+ | text: "Text in this" | ||
+ | font.pixelSize: | ||
+ | focus: true | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Фокус ==== | ||
+ | ---- | ||
+ | Если на форме один элемент, | ||
+ | Нетекстовые элементы так же могут иметь фокус.\\ | ||
+ | Для управления порядком фокуса табом, используется т.н. прикрепляемое свойство " | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 200; height: 80; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | TextEdit | ||
+ | { | ||
+ | anchors | ||
+ | { | ||
+ | left: parent.left | ||
+ | right: parent.horizontalCenter | ||
+ | top: parent.top | ||
+ | bottom: parent.bottom | ||
+ | } | ||
+ | text: " | ||
+ | font.pixelSize: | ||
+ | color: focus ? " | ||
+ | focus: true | ||
+ | } | ||
+ | TextEdit | ||
+ | { | ||
+ | anchors | ||
+ | { | ||
+ | left: parent.horizontalCenter | ||
+ | right: parent.right | ||
+ | top: parent.top | ||
+ | bottom: parent.bottom | ||
+ | } | ||
+ | text: " | ||
+ | font.pixelSize: | ||
+ | color: focus ? " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Сырой ввод ==== | ||
+ | ---- | ||
+ | С помощью прикрепляемого свойства **Keys** можно получить доступ к событиям клавиатуры, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 200; height: 80; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Text | ||
+ | { | ||
+ | x: 20; y: 20; | ||
+ | text: "Move this text" | ||
+ | horizontalAlignment: | ||
+ | Keys.onLeftPressed: | ||
+ | Keys.onRightPressed: | ||
+ | Keys.onUpPressed: | ||
+ | Keys.onDownPressed: | ||
+ | focus: true | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | При помощи **Keys.forwardTo** можно пересылать события другим элементам, | ||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 200; height: 80; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Text | ||
+ | { | ||
+ | x: 20; y: 20; | ||
+ | text: "Move this text" | ||
+ | horizontalAlignment: | ||
+ | focus: true | ||
+ | Keys.onPressed: | ||
+ | { | ||
+ | if(event.key === Qt.Key_Left) { x -= 3; } | ||
+ | else if(event.key === Qt.Key_Right) { x += 3; } | ||
+ | else if(event.key === Qt.Key_Down) { y += 3; } | ||
+ | else if(event.key === Qt.Key_Up) {y -= 3; } | ||
+ | else if(event.key === Qt.Key_Plus) {font.pixelSize++; | ||
+ | else if(event.key === Qt.Key_Minus) {font.pixelSize--; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Мультитач ==== | ||
+ | ---- | ||
+ | Область региона- **MultiPointTouchArea**. Он содержит в себе элементы обработки события касания- **TouchPoint**, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 400; height: 400; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | color: " | ||
+ | MultiPointTouchArea | ||
+ | { | ||
+ | anchors.fill: | ||
+ | minimumTouchPoints: | ||
+ | maximumTouchPoints: | ||
+ | touchPoints: | ||
+ | [ | ||
+ | TouchPoint {}, | ||
+ | TouchPoint {}, | ||
+ | TouchPoint {}, | ||
+ | TouchPoint {}, | ||
+ | TouchPoint {} | ||
+ | ] | ||
+ | Repeater | ||
+ | { | ||
+ | model: parent.touchPoints | ||
+ | Rectangle | ||
+ | { | ||
+ | color: " | ||
+ | x: modelData.x; | ||
+ | width: 30; height: 30 | ||
+ | visible: modelData.pressed | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Так же, у **TouchPoint** есть следующие св-ва: | ||
+ | | pressed | При касании == true | | ||
+ | | pressure | Сила нажатия (не все устр-ва поддерживают) | | ||
+ | | previous{X, | ||
+ | | start{X,Y} | Начальные координаты касания | | ||
+ | | x,y | Текущие координаты касания | | ||
+ | |||
+ | |||
+ | ===== Анимация ===== | ||
+ | ==== Анимация при изменении свойств ==== | ||
+ | ---- | ||
+ | Для анимации свойств существует элемент **PropertyAnimation**, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 400; height: 400; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | color: " | ||
+ | Image | ||
+ | { | ||
+ | id: img | ||
+ | x: 0; y: 0; | ||
+ | source: " | ||
+ | } | ||
+ | PropertyAnimation | ||
+ | { | ||
+ | target: img | ||
+ | properties: " | ||
+ | // Начальное и конечное значение для св-в | ||
+ | from: 0; to: 400 - img.height | ||
+ | // Длительность мс | ||
+ | duration: 1500 | ||
+ | running: true | ||
+ | loops: Animation.Infinite | ||
+ | // Режим. скорость и т.д. есть интерактивный редактор | ||
+ | easing.type: | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | === Изменение числовых значений === | ||
+ | ---- | ||
+ | Более эффективная реализация для **real** и **int**.\\ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 300; height: 100; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | id: par | ||
+ | anchors.fill: | ||
+ | color: " | ||
+ | Rectangle | ||
+ | { | ||
+ | x: 0; y: 0; | ||
+ | height: 100 | ||
+ | color: " | ||
+ | NumberAnimation on width | ||
+ | { | ||
+ | id: anim1 | ||
+ | from: 300; to: 0 | ||
+ | duration: 2000 | ||
+ | easing.type: | ||
+ | onStopped: | ||
+ | { | ||
+ | anim2.start() | ||
+ | } | ||
+ | } | ||
+ | |||
+ | NumberAnimation on width | ||
+ | { | ||
+ | id: anim2 | ||
+ | from: 0; to: 300 | ||
+ | duration: 2000 | ||
+ | easing.type: | ||
+ | running: false | ||
+ | onStopped: | ||
+ | { | ||
+ | anim1.start() | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | === Изменение цвета === | ||
+ | ---- | ||
+ | **ColorAnimation** управляет изменением цвета, так же используется **from** и **to**.\\ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 300; height: 100; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | ColorAnimation on color | ||
+ | { | ||
+ | from: " | ||
+ | to: " | ||
+ | duration: 1500 | ||
+ | running: true | ||
+ | loops: Animation.Infinite | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | === Поворот === | ||
+ | ---- | ||
+ | **RotationAnimation** описывает поворот элемента.\\ | ||
+ | Его свойство **direction** задает направление поворота: | ||
+ | | RotationAnimation.Clockwise | по часовой (по умолчанию) | | ||
+ | | RotationAnimation.Counterclockwise | против часовой | | ||
+ | | RotationAnimationShortest | угол поворота в наименьшую сторону исходя из " | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 150; height: 150; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Image | ||
+ | { | ||
+ | source: " | ||
+ | anchors.centerIn: | ||
+ | smooth: true | ||
+ | RotationAnimation on rotation | ||
+ | { | ||
+ | from: 0 | ||
+ | to: 360 | ||
+ | duration: 2000 | ||
+ | loops: Animation.Infinite | ||
+ | easing.type: | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Анимация поведения ==== | ||
+ | ---- | ||
+ | **Behavior** реагирует на изменение свойств элементов, | ||
+ | В следующем примере, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 360; height: 360; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | id: rect | ||
+ | anchors.fill: | ||
+ | Image | ||
+ | { | ||
+ | id: img | ||
+ | x: 10; y: 10; | ||
+ | source: " | ||
+ | smooth: true | ||
+ | Text | ||
+ | { | ||
+ | anchors.verticalCenter: | ||
+ | anchors.top: | ||
+ | text: "Move cursor" | ||
+ | } | ||
+ | Behavior on x | ||
+ | { | ||
+ | NumberAnimation | ||
+ | { | ||
+ | duration: 500 | ||
+ | easing.type: | ||
+ | } | ||
+ | } | ||
+ | Behavior on y | ||
+ | { | ||
+ | NumberAnimation | ||
+ | { | ||
+ | duration: 500 | ||
+ | easing.type: | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | MouseArea | ||
+ | { | ||
+ | anchors.fill: | ||
+ | hoverEnabled: | ||
+ | onMouseXChanged: | ||
+ | onMouseYChanged: | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Параллельные и последовательные анимации ==== | ||
+ | ---- | ||
+ | Анимации могут быть объединены в группы, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 360; height: 360; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Image | ||
+ | { | ||
+ | id: img | ||
+ | source: " | ||
+ | smooth: true | ||
+ | anchors.centerIn: | ||
+ | } | ||
+ | ParallelAnimation | ||
+ | { | ||
+ | NumberAnimation | ||
+ | { | ||
+ | target: img | ||
+ | properties: " | ||
+ | from: 0.1 | ||
+ | to: 3.0 | ||
+ | duration: 2000 | ||
+ | easing.type: | ||
+ | } | ||
+ | NumberAnimation | ||
+ | { | ||
+ | target: img | ||
+ | properties: " | ||
+ | from: 1.0 | ||
+ | to: 0 | ||
+ | duration: 2000 | ||
+ | } | ||
+ | running: true | ||
+ | loops: Animation.Infinite | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 360; height: 360; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Image | ||
+ | { | ||
+ | id: img | ||
+ | source: " | ||
+ | smooth: true | ||
+ | anchors.centerIn: | ||
+ | NumberAnimation on scale | ||
+ | { | ||
+ | from: 0.1 | ||
+ | to: 3.0 | ||
+ | duration: 2000 | ||
+ | easing.type: | ||
+ | loops: Animation.Infinite | ||
+ | } | ||
+ | NumberAnimation on opacity | ||
+ | { | ||
+ | from: 1.0 | ||
+ | to: 0 | ||
+ | duration: 2000 | ||
+ | loops: Animation.Infinite | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Пример последовательной анимации: | ||
< | < | ||
< | < | ||
<code QML> | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 130; height: 450; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Image | ||
+ | { | ||
+ | id: img | ||
+ | source: " | ||
+ | smooth: true | ||
+ | Text | ||
+ | { | ||
+ | anchors.horizontalCenter: | ||
+ | anchors.top: | ||
+ | text: "Click for do it" | ||
+ | } | ||
+ | MouseArea | ||
+ | { | ||
+ | anchors.fill: | ||
+ | onClicked: anim.running= true | ||
+ | } | ||
+ | SequentialAnimation | ||
+ | { | ||
+ | id: anim | ||
+ | NumberAnimation | ||
+ | { | ||
+ | target: img | ||
+ | from: 20; to: 300; | ||
+ | properties: " | ||
+ | duration: 1000 | ||
+ | easing.type: | ||
+ | } | ||
+ | RotationAnimation | ||
+ | { | ||
+ | target: img | ||
+ | from: 0; to: 360; | ||
+ | properties: " | ||
+ | duration: 1000 | ||
+ | } | ||
+ | PauseAnimation {duration: 500} | ||
+ | NumberAnimation | ||
+ | { | ||
+ | target: img | ||
+ | from: 300; to: 20; | ||
+ | properties: " | ||
+ | duration: 1000 | ||
+ | easing.type: | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
</ | </ | ||
</ | </ | ||
+ | |||
+ | ==== Состояния и переходы ==== | ||
+ | === Состояния === | ||
+ | ---- | ||
+ | Управлять состоянием можно при помощи элемента **State**, поддерживает наборы списков, | ||
+ | Все объекты **обязательно** должны быть **именованными**.\\ | ||
+ | Список состояний присваивается свойству **states** а необходимый набор присваивается свойству **state**, так и происходит смена состояний.\\ | ||
+ | Изменение свойств внутри состояния перечисляется в в элементе **PropertyChanges** | ||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 360; height: 360; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | |||
+ | Rectangle | ||
+ | { | ||
+ | id: rect | ||
+ | state: " | ||
+ | Text | ||
+ | { | ||
+ | id: txt | ||
+ | anchors.centerIn: | ||
+ | } | ||
+ | } | ||
+ | states: | ||
+ | [ | ||
+ | State | ||
+ | { | ||
+ | name: " | ||
+ | PropertyChanges | ||
+ | { | ||
+ | target: rect | ||
+ | color: " | ||
+ | width: 150; height: 60; | ||
+ | } | ||
+ | PropertyChanges | ||
+ | { | ||
+ | target: txt | ||
+ | text: " | ||
+ | } | ||
+ | }, | ||
+ | State | ||
+ | { | ||
+ | name: " | ||
+ | PropertyChanges | ||
+ | { | ||
+ | target: rect | ||
+ | color: " | ||
+ | width: 200; height: 120; | ||
+ | } | ||
+ | PropertyChanges | ||
+ | { | ||
+ | target: txt | ||
+ | text: " | ||
+ | } | ||
+ | } | ||
+ | ] | ||
+ | MouseArea | ||
+ | { | ||
+ | anchors.fill: | ||
+ | onClicked: parent.state= (parent.state== " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Переходы ==== | ||
+ | ---- | ||
+ | Свойство **transitions** задает список переходов, | ||
+ | * **from / to** - начальное/ | ||
+ | * **PropertyAnimation** - управление анимацией перехода | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 360; height: 360; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Rectangle | ||
+ | { | ||
+ | id: rect | ||
+ | width: 100; height: 100 | ||
+ | color: " | ||
+ | state: " | ||
+ | Text | ||
+ | { | ||
+ | anchors.centerIn: | ||
+ | text: "Click this" | ||
+ | } | ||
+ | MouseArea | ||
+ | { | ||
+ | anchors.fill: | ||
+ | onClicked: rect.state = (rect.state == " | ||
+ | } | ||
+ | states: | ||
+ | [ | ||
+ | State | ||
+ | { | ||
+ | name: " | ||
+ | PropertyChanges {target: rect; x: 0; y: 0} | ||
+ | }, | ||
+ | State | ||
+ | { | ||
+ | name: " | ||
+ | PropertyChanges {target: rect; x: 200; y: 200} | ||
+ | } | ||
+ | ] | ||
+ | transitions: | ||
+ | [ | ||
+ | Transition | ||
+ | { | ||
+ | from: " | ||
+ | PropertyAnimation | ||
+ | { | ||
+ | target: rect; | ||
+ | properties: " | ||
+ | duration: 1000 | ||
+ | easing.type: | ||
+ | } | ||
+ | }, | ||
+ | Transition | ||
+ | { | ||
+ | from: " | ||
+ | PropertyAnimation | ||
+ | { | ||
+ | target: rect; | ||
+ | properties: " | ||
+ | duration: 1000 | ||
+ | easing.type: | ||
+ | } | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Если свойства перехода будут одинаковыми, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 300; height: 300; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Rectangle | ||
+ | { | ||
+ | id: rect | ||
+ | width: 100; height: 100 | ||
+ | color: " | ||
+ | state: " | ||
+ | Text | ||
+ | { | ||
+ | anchors.centerIn: | ||
+ | text: "Click this" | ||
+ | } | ||
+ | MouseArea | ||
+ | { | ||
+ | anchors.fill: | ||
+ | onClicked: rect.state = (rect.state == " | ||
+ | } | ||
+ | states: | ||
+ | [ | ||
+ | State | ||
+ | { | ||
+ | name: " | ||
+ | PropertyChanges {target: rect; x: 0; y: 0} | ||
+ | }, | ||
+ | State | ||
+ | { | ||
+ | name: " | ||
+ | PropertyChanges {target: rect; x: 200; y: 200} | ||
+ | } | ||
+ | ] | ||
+ | transitions: | ||
+ | [ | ||
+ | Transition | ||
+ | { | ||
+ | from: " | ||
+ | PropertyAnimation | ||
+ | { | ||
+ | target: rect; | ||
+ | properties: " | ||
+ | duration: 1000 | ||
+ | easing.type: | ||
+ | } | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Модуль частиц ==== | ||
+ | ---- | ||
+ | Движок для работы с частицами, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2; import QtQuick.Particles 2.0 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 360; height: 360; visible: true | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | color: " | ||
+ | ParticleSystem | ||
+ | { | ||
+ | anchors.fill: | ||
+ | ImageParticle | ||
+ | { | ||
+ | source: " | ||
+ | } | ||
+ | Emitter | ||
+ | { | ||
+ | width: parent.width | ||
+ | height: parent.height | ||
+ | anchors.bottom: | ||
+ | lifeSpan: 10000 | ||
+ | sizeVariation: | ||
+ | emitRate: 20 | ||
+ | velocity: AngleDirection | ||
+ | { | ||
+ | angle: 90 | ||
+ | angleVariation: | ||
+ | magnitude: 100 | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||