Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
develop:qt:quick2 [2021/08/29 08:59] 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: | ||
</ | </ | ||
+ | |||
==== Сигналы ==== | ==== Сигналы ==== | ||
---- | ---- | ||
Строка 423: | Строка 423: | ||
</ | </ | ||
+ | |||
==== Ввод с клавиатуры ==== | ==== Ввод с клавиатуры ==== | ||
---- | ---- | ||
Строка 455: | Строка 455: | ||
</ | </ | ||
+ | |||
==== Фокус ==== | ==== Фокус ==== | ||
---- | ---- | ||
Строка 461: | Строка 461: | ||
Нетекстовые элементы так же могут иметь фокус.\\ | Нетекстовые элементы так же могут иметь фокус.\\ | ||
Для управления порядком фокуса табом, используется т.н. прикрепляемое свойство " | Для управления порядком фокуса табом, используется т.н. прикрепляемое свойство " | ||
- | |||
- | |||
< | < | ||
Строка 507: | Строка 505: | ||
</ | </ | ||
+ | |||
==== Сырой ввод ==== | ==== Сырой ввод ==== | ||
---- | ---- | ||
Строка 572: | Строка 570: | ||
</ | </ | ||
+ | |||
==== Мультитач ==== | ==== Мультитач ==== | ||
---- | ---- | ||
Строка 626: | Строка 624: | ||
| x,y | Текущие координаты касания | | | x,y | Текущие координаты касания | | ||
- | + | ||
===== Анимация ===== | ===== Анимация ===== | ||
==== Анимация при изменении свойств ==== | ==== Анимация при изменении свойств ==== | ||
Строка 669: | Строка 666: | ||
</ | </ | ||
+ | |||
=== Изменение числовых значений === | === Изменение числовых значений === | ||
---- | ---- | ||
Строка 675: | Строка 672: | ||
< | < | ||
- | < | + | < |
<code QML> | <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> | <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> | <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> | <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 | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||