Я думал, что ScrollBar.vertical
- это вариант bool, но почему после двоеточия есть объект ScrollBar { id: scrollBar }
?
Ответ прост: потому что ScrollBar.vertical
не является ни bool, ни вариантом, но имееттип ScrollBar
.Это указано в документации.
ScrollBar.vertical : ScrollBar
Это свойство прикрепляет вертикальную полосу прокрутки к Flickable.
Flickable {
contentHeight: 2000
ScrollBar.vertical: ScrollBar { }
}
Обратите внимание наподзаголовок сообщает нам тип после двоеточия: ScrollBar
.
Есть ли документация об этом синтаксисе?
Да, есть.Я скопировал вышеупомянутое с этой страницы .
В чем разница между использованием [...]
Я буду разбираться с каждым сбивающим с толкуСтрока кода и маркируйте каждый своим именем.
ScrollBar.vertical: ScrollBar { id: scrollBar }
// Attached Property
ScrollBar { id: scrollBar; orientation: Qt.Vertical }
// Child Object
anchors.fill: parent
// Grouped Property
Давайте рассмотрим эти по одному.
Прикрепленные свойства
Прикрепленные свойства [...] - это механизмы, позволяющие аннотировать объекты дополнительными свойствами или обработчиками сигналов, которые в противном случае недоступны для объекта.В частности, они позволяют объектам получать доступ к свойствам или сигналам, которые имеют непосредственное отношение к отдельному объекту.
Ссылки на присоединенные свойства [...] имеют следующую синтаксическую форму:
<AttachingType>.<propertyName>
Например, тип ListView
имеет вложенное свойство ListView.isCurrentItem
, которое доступно каждому объекту делегата в ListView
.Это может использоваться каждым отдельным объектом делегата, чтобы определить, является ли он выбранным в данный момент элементом в представлении:
import QtQuick 2.0
ListView {
width: 240; height: 320
model: 3
delegate: Rectangle {
width: 100; height: 30
color: ListView.isCurrentItem ? "red" : "yellow"
}
}
В этом случае имя присоединяемого типа равно ListView
и рассматриваемое свойстворавен isCurrentItem
, следовательно, присоединенное свойство называется ListView.isCurrentItem
.
(источник)
В нашем конкретном случае ScrollBar
- это тип присоединения , а vertical
- это свойство .
Имейте в виду, что существует несколько различий междуListView.isCurrentItem
и ScrollBar.vertical
.Первый имеет тип bool
, а второй - ScrollBar
.Кроме того, первое свойство read-only
означает, что мы не можем присвоить или изменить его.С другой стороны, вы можете присвоить ScrollBar.vertical
.
Если ListView.isCurrentItem
не был только для чтения, мы могли бы назначить его так же, как мы сделали с ScrollBar.vertical
.
delegate: Rectangle {
ListView.isCurrentItem: true
}
Но поскольку он предназначен только для чтения, возникает ошибка.
Дочерние объекты
Это основы QML прямо здесь.Вот пример:
ApplicationWindow {
visible: true
width: 800; height: 600
// child object of ApplicationWindow
Rectangle {
width: 200; height: 200
color: "red"
// child object of Rectangle
Text { text: "Hello World" }
}
// child object of ApplicationWindow
Rectangle {
x: 400
width: 200; height: 200
color: "blue"
}
}
Оглядываясь назад на ScrollBar
:
Flickable {
ScrollBar { id: scrollBar; orientation: Qt.Vertical }
}
Это создаст экземпляр дочернего объекта ScrollBar
, но это так.Нет добавленной функциональности.
Сгруппированные свойства
В некоторых случаях свойства содержат логическую группу атрибутов под-свойств.Эти атрибуты подчиненного свойства могут быть назначены с использованием либо точечной нотации, либо нотации группы.
Например, тип Text
имеет свойство группы шрифтов.Ниже первый Text
объект инициализирует свои значения font
, используя точечную нотацию, а второй использует групповую нотацию:
Text {
//dot notation
font.pixelSize: 12
font.b: true
}
Text {
//group notation
font { pixelSize: 12; b: true }
}
(источник)
Другим распространенным примером сгруппированного свойства является anchors
(как вы могли заметить).
Не позволяйте точечной нотации сбить вас с толку.Попытайтесь определить общую разницу между двумя свойствами ниже:
anchors.top
ScrollBar.vertical
Важное различие заключается в том, что свойства должны начинаться со строчной буквы , тогда как начинаются типы QMLс заглавной буквы .Имея это в виду, мы можем видеть, что anchors
явно является свойством, в то время как ScrollBar
является типом.
Учитывая это, я думаю, мы можем попытаться решить еще одну проблему.
Зачем использовать вложенные свойства вместо определения ScrollBar
в качестве дочернего объекта?
Из-за лучшей автоматизации.Из документации:
Когда ScrollBar
прикреплен вертикально или горизонтально к Flickable
, его геометрия и следующие свойства автоматически устанавливаются и обновляются соответствующим образом:
- ориентация
- положение
- размер
- активный
Прикрепленный ScrollBar
переопределяет себя к цели Flickable
. Вертикально прикрепленный ScrollBar
изменяет размеры до высоты Flickable
и позиционирует себя по обе стороны от него в зависимости от направления компоновки. Горизонтально прикрепленный ScrollBar
изменяет размеры до ширины Flickable
и позиционируется внизу.
(источник)
Это позволяет вам сосредоточиться на других вещах, а не беспокоиться о положении полосы прокрутки.
Но, конечно, создание ScrollBar
в качестве дочернего объекта (не присоединенного) также имеет свои преимущества.
Можно создать экземпляр ScrollBar
без использования API подключенного свойства. Это полезно, когда поведение прикрепленной полосы прокрутки недостаточно или Flickable
не используется. [...]
При использовании незакрепленной полосы прокрутки, следующее должно быть сделано вручную:
- Компоновка полосы прокрутки (например, со свойствами x и y или привязками).
- Установите свойства размера и положения, чтобы определить размер и положение полосы прокрутки по отношению к прокручиваемому элементу.
- Установите активное свойство, чтобы определить, когда будет видна полоса прокрутки.
* +1196 ** ** 1198 тысяча сто девяносто-семь *
(источник) * +1202 *