Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
develop:qt:quick [2021/08/15 06:50] admin |
develop:qt:quick [2021/08/31 15:22] (текущий) admin |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Qt Quick ====== | + | ====== Qt Quick: Общее, Элементы, |
**Qt Quick** - набор технологий для создания пользовательского интерфейса.\\ | **Qt Quick** - набор технологий для создания пользовательского интерфейса.\\ | ||
Строка 24: | Строка 24: | ||
return a > b ? a:b; | return a > b ? a:b; | ||
} | } | ||
- | |||
| | ||
} | } | ||
Строка 46: | Строка 45: | ||
- | ===== Примеры ===== | + | < |
- | + | < | |
- | Простое окно с полем ввода | + | |
<code QML> | <code QML> | ||
import QtQuick 2.12 | import QtQuick 2.12 | ||
Строка 59: | Строка 57: | ||
visible: true | visible: true | ||
title: "Hello World" | title: "Hello World" | ||
- | |||
MouseArea | MouseArea | ||
{ | { | ||
anchors.fill: | anchors.fill: | ||
- | onClicked: | + | onClicked: console.log(' |
- | { | + | |
- | | + | |
- | } | + | |
} | } | ||
- | |||
TextEdit | TextEdit | ||
{ | { | ||
Строка 87: | Строка 80: | ||
} | } | ||
</ | </ | ||
+ | </ | ||
+ | |||
===== Объекты ===== | ===== Объекты ===== | ||
- | |||
==== Не визуальные ==== | ==== Не визуальные ==== | ||
+ | ---- | ||
| Column; Row; Grid, Flow, Positioner; etc | Для размещения элементов | | | Column; Row; Grid, Flow, Positioner; etc | Для размещения элементов | | ||
| Timer; Loader; Connections, | | Timer; Loader; Connections, | ||
Строка 99: | Строка 92: | ||
| [Mouse; Drop; Pinch; MultiPointTouch]Area; | | [Mouse; Drop; Pinch; MultiPointTouch]Area; | ||
+ | |||
==== Визуальные ==== | ==== Визуальные ==== | ||
+ | ---- | ||
| Item | Базовый тип для всех элементов, | | Item | Базовый тип для всех элементов, | ||
| Rectangle | Заполненная прямоугольная область, | | Rectangle | Заполненная прямоугольная область, | ||
Строка 114: | Строка 107: | ||
**Элементы-потомки** отображаются **относительно и внутри** своего **родительского** элемента. | **Элементы-потомки** отображаются **относительно и внутри** своего **родительского** элемента. | ||
+ | < | ||
+ | < | ||
<code QML> | <code QML> | ||
import QtQuick 2.8 | import QtQuick 2.8 | ||
Строка 143: | Строка 138: | ||
} | } | ||
</ | </ | ||
+ | </ | ||
+ | |||
+ | ==== Свойства элементов ==== | ||
+ | ---- | ||
+ | Стандартные свойства для всех элементов: | ||
+ | | x; y; z; position | Позиционирование | | ||
+ | | width; height; implicit[Width; | ||
+ | | rotation; scale; clip; transform; smooth; transformOrigin; | ||
+ | | anchors | Фиксация | | ||
+ | | id; parent | Ссылки на элементы | | ||
+ | | enabled; focus | Доступность; | ||
+ | | visible; opacity; visibleChildren | Видимость | | ||
+ | | states; state; transitions | Состояние и переход | | ||
+ | | layer | Работа со слоями | | ||
+ | | children; childrenRect | Дочерние элементы | | ||
+ | | onWidthChanged; | ||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.8 | ||
+ | import QtQuick.Window 2.2 | ||
+ | Window | ||
+ | { | ||
+ | visible: true | ||
+ | width: 360 | ||
+ | height: 360 | ||
+ | Rectangle | ||
+ | { | ||
+ | id: redrect | ||
+ | color: " | ||
+ | x: 0 | ||
+ | y: 0 | ||
+ | width: parent.width / 2 | ||
+ | height: parent.height / 2 | ||
+ | } | ||
+ | Rectangle | ||
+ | { | ||
+ | color: " | ||
+ | x: redrect.width | ||
+ | y: redrect.height | ||
+ | width: redrect.width | ||
+ | height: redrect.height | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | === Собственные свойства === | ||
+ | ---- | ||
+ | **property < | ||
+ | Элементам можно задавать собственные свойства. Они могут содержать значения, | ||
+ | Необходимо указывать **типы данных**, | ||
+ | |||
+ | ==== Собственные элементы ==== | ||
+ | ---- | ||
+ | Определяются в отдельных файлах, | ||
+ | Элементы расположенные в одном каталоге **автоматически доступны** друг для друга.\\ | ||
+ | Из вне будут доступны только свойства базового элемента, | ||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | // Описание элемента в отдельном файле, в папке в проектом | ||
+ | import QtQuick 2.8 | ||
+ | Rectangle | ||
+ | { | ||
+ | property alias text: txt.text | ||
+ | property string name: " | ||
+ | width: txt.width | ||
+ | height: txt.height | ||
+ | Text | ||
+ | { | ||
+ | id: txt | ||
+ | x: 0 | ||
+ | y: 0 | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code QML> | ||
+ | // Использование элемента | ||
+ | import QtQuick 2.8 | ||
+ | import QtQuick.Window 2.2 | ||
+ | |||
+ | Window | ||
+ | { | ||
+ | visible: true; width: 360; height: 360 | ||
+ | TextField | ||
+ | { | ||
+ | x: 10 | ||
+ | y: 20 | ||
+ | color: " | ||
+ | text: "This Text in myTextField< | ||
+ | border.width: | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Собственные модули ==== | ||
+ | ---- | ||
+ | Коллекции QML элементов можно объединять в модули и использовать повторно, | ||
+ | Располагают их в отдельной папке, создают файл **qmldir** с картой описания qml файлов элементов, | ||
+ | |||
+ | |||
+ | ==== Динамическое создание элементов ==== | ||
+ | ---- | ||
+ | Элемент **Repeater** позволяет производить элементы используя любой тип модели данных (число, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.8 | ||
+ | import QtQuick.Window 2.2 | ||
+ | |||
+ | Window | ||
+ | { | ||
+ | visible: true; width: 360; height: 360 | ||
+ | Repeater | ||
+ | { | ||
+ | model: [" | ||
+ | Text | ||
+ | { | ||
+ | text: modelData // обращение к массиву значений | ||
+ | y: index * 20 // index - номер текущего элемента | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | **Flickable** - типа скроллбара, | ||
+ | |||
+ | |||
+ | ==== Готовые элементы ==== | ||
+ | ---- | ||
+ | В модуле **QtQuick.Controls** содержится ряд готовых элементов GUI.\\ | ||
+ | Такие элементы как: CheckBox, DelayButton, | ||
+ | |||
+ | Область основного окна делится на три зоны: Верхняя (header), Нижняя (footer) и Рабочая (в середине) | ||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.8 | ||
+ | import QtQuick.Window 2.2 | ||
+ | |||
+ | Window | ||
+ | { | ||
+ | visible: true; width: 360; height: 360 | ||
+ | header: ToolBar | ||
+ | { | ||
+ | // | ||
+ | } | ||
+ | footer: ToolBar | ||
+ | { | ||
+ | // | ||
+ | } | ||
+ | // | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Так же, в модуле **QtQuick.Extras** есть аналогичные, | ||
+ | |||
+ | |||
+ | ==== Диалоговые окна ==== | ||
+ | ---- | ||
+ | В основном это: **FileDialog**, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.8 | ||
+ | //import QtQuick.Window 2.2 | ||
+ | import QtQuick.Controls 2.2 | ||
+ | import QtQuick.Dialogs 1.2 | ||
+ | |||
+ | ApplicationWindow // Window | ||
+ | { | ||
+ | visible: true; width: 200; height: 150 | ||
+ | Repeater | ||
+ | { | ||
+ | id: repeater | ||
+ | model: [colorDialog, | ||
+ | Button | ||
+ | { | ||
+ | y: index * (parent.height / repeater.count) | ||
+ | height: parent.height / repeater.count | ||
+ | width: parent.width | ||
+ | text: modelData.title | ||
+ | onClicked: | ||
+ | { | ||
+ | messageDialog.visible = false | ||
+ | modelData.visible = true | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | ColorDialog | ||
+ | { | ||
+ | id: colorDialog | ||
+ | visible: false | ||
+ | modality: Qt.WindowModal | ||
+ | title: " | ||
+ | color: " | ||
+ | onAccepted: | ||
+ | { | ||
+ | messageDialog.informativeText = " | ||
+ | messageDialog.visible = true | ||
+ | } | ||
+ | } | ||
+ | FontDialog | ||
+ | { | ||
+ | id: fontDialog | ||
+ | visible: false | ||
+ | modality: Qt.WindowModal | ||
+ | title: " | ||
+ | onAccepted: | ||
+ | { | ||
+ | messageDialog.informativeText = " | ||
+ | messageDialog.visible = true | ||
+ | } | ||
+ | } | ||
+ | FileDialog | ||
+ | { | ||
+ | id: fileDialog | ||
+ | visible: false | ||
+ | modality: Qt.WindowModal | ||
+ | title: " | ||
+ | folder: " | ||
+ | nameFilters: | ||
+ | onAccepted: | ||
+ | { | ||
+ | messageDialog.informativeText = " | ||
+ | messageDialog.visible = true | ||
+ | } | ||
+ | } | ||
+ | MessageDialog | ||
+ | { | ||
+ | id: messageDialog | ||
+ | visible: false | ||
+ | modality: Qt.NonModal | ||
+ | title: " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Управление размещением ===== | ||
+ | ==== Фиксаторы ==== | ||
+ | ---- | ||
+ | **Фиксатор (anchors)** позволяет определить расположение одного элемента относительно других.\\ | ||
+ | В **QML** все элементы вложены друг в друга и располагаются элементы относительно своего родителя.\\ | ||
+ | |||
+ | Для фиксации можно использовать свойства: | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Window 2.12 | ||
+ | |||
+ | Window | ||
+ | { | ||
+ | width: 640; height: 480; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Text | ||
+ | { | ||
+ | text: "This is text in text-element" | ||
+ | anchors.centerIn: | ||
+ | | ||
+ | // или аналогично: | ||
+ | // | ||
+ | // | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Эти же свойства можно использовать для заполнения элементом области | ||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Window 2.12 | ||
+ | |||
+ | Window | ||
+ | { | ||
+ | width: 640; height: 480; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | // Для группы свойств | ||
+ | anchors | ||
+ | { | ||
+ | left: parent.left | ||
+ | right: parent.right | ||
+ | top: parent.top | ||
+ | bottom: parent.bottom | ||
+ | } | ||
+ | // Аналогично | ||
+ | // | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 640; height: 480; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Rectangle | ||
+ | { | ||
+ | id: firstRec | ||
+ | color: " | ||
+ | width: parent.width / 1.5 | ||
+ | height: parent.height / 1.5 | ||
+ | anchors.left: | ||
+ | anchors.top: | ||
+ | } | ||
+ | Rectangle | ||
+ | { | ||
+ | opacity: 0.5 | ||
+ | color: " | ||
+ | anchors | ||
+ | { | ||
+ | top: firstRec.verticalCenter | ||
+ | left: firstRec.horizontalCenter | ||
+ | right: parent.right | ||
+ | bottom: parent.bottom | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 640; height: 480; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Rectangle | ||
+ | { | ||
+ | id: leftrec | ||
+ | width: 60 | ||
+ | color: " | ||
+ | anchors | ||
+ | { | ||
+ | left: parent.left | ||
+ | top: parent.top | ||
+ | bottom: parent.bottom | ||
+ | topMargin: 10 | ||
+ | bottomMargin: | ||
+ | } | ||
+ | } | ||
+ | Rectangle | ||
+ | { | ||
+ | id: rightrec | ||
+ | width: 60 | ||
+ | color: " | ||
+ | anchors | ||
+ | { | ||
+ | right: parent.right | ||
+ | top: parent.top | ||
+ | bottom: parent.bottom | ||
+ | topMargin: 10 | ||
+ | bottomMargin: | ||
+ | } | ||
+ | } | ||
+ | Rectangle | ||
+ | { | ||
+ | id: centerrec | ||
+ | color: " | ||
+ | anchors | ||
+ | { | ||
+ | top: parent.top | ||
+ | bottom: parent.bottom | ||
+ | left: leftrec.right | ||
+ | right: rightrec.left | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Традиционные размещения ==== | ||
+ | ---- | ||
+ | Размещения являются элементами | ||
+ | | Row, RowLayout | Горизонтальное размещение, | ||
+ | | Column, ColumnLayout | Вертикальное размещение, | ||
+ | | Grid, GridLayout | Табличное размещение, | ||
+ | | StackLayout | Одновременно можно видеть только один элемент, | ||
+ | |||
+ | Содержат свойства **spacing** и **layoutDirection**, | ||
+ | Элементы со словом **layout**, содержатся в модуле **QtQuick.Layouts** и обладают доп. свойством **Layout**: | ||
+ | | .minimum{Width, | ||
+ | | .maximum{Width, | ||
+ | | .preferred{Width, | ||
+ | | .fill{Width, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; //import QtQuick.Window 2.12 | ||
+ | import QtQuick.Controls 2.2 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 640; height: 480; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Row | ||
+ | { | ||
+ | anchors.centerIn: | ||
+ | spacing: 10 | ||
+ | Rectangle | ||
+ | { | ||
+ | width: 64; height: 64; color: " | ||
+ | } | ||
+ | Rectangle | ||
+ | { | ||
+ | width: 64; height: 64; color: " | ||
+ | } | ||
+ | Rectangle | ||
+ | { | ||
+ | width: 64; height: 64; color: " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2; import QtQuick.Layouts 1.12 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 640; height: 480; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | RowLayout | ||
+ | { | ||
+ | anchors.fill: | ||
+ | spacing: 10 | ||
+ | Layout.margins: | ||
+ | Rectangle | ||
+ | { | ||
+ | Layout.minimumWidth: | ||
+ | } | ||
+ | Rectangle | ||
+ | { | ||
+ | Layout.minimumWidth: | ||
+ | } | ||
+ | Rectangle | ||
+ | { | ||
+ | Layout.minimumWidth: | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Размещение в виде потока ==== | ||
+ | ---- | ||
+ | Упорядочивает элементы змейкой, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <code QML> | ||
+ | import QtQuick 2.12; import QtQuick.Controls 2.2; import QtQuick.Layouts 1.12 | ||
+ | |||
+ | ApplicationWindow | ||
+ | { | ||
+ | width: 640; height: 480; visible: true; | ||
+ | Rectangle | ||
+ | { | ||
+ | anchors.fill: | ||
+ | Flow | ||
+ | { | ||
+ | anchors.fill: | ||
+ | anchors.margins: | ||
+ | spacing: 20 | ||
+ | Repeater | ||
+ | { | ||
+ | model: | ||
+ | { | ||
+ | var v = new Array(10); | ||
+ | for(var i= 0; i < v.length; ++i) | ||
+ | v[i]= i % 2 ? " | ||
+ | return v; | ||
+ | } | ||
+ | Rectangle | ||
+ | { | ||
+ | width: 64; height: 64; radius: 32; color: modelData | ||
+ | Text | ||
+ | { | ||
+ | color: " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ |