Как правильно понимать синтаксис ScrollBar в QtQuick / QML? - PullRequest
2 голосов
/ 08 мая 2019

Недавно я использовал Scrollbar с TableView. Я сослался на Документация QML для ScrollBar , и я вижу пример:

Flickable {
    focus: true

    Keys.onUpPressed: scrollBar.decrease()
    Keys.onDownPressed: scrollBar.increase()

    ScrollBar.vertical: ScrollBar { id: scrollBar }
}

Я думал, что ScrollBar.vertical вариант bool, но почему после двоеточия есть объект ScrollBar { id: scrollBar }?

Есть ли документация по этому синтаксису?

В чем разница между использованием

  1. ScrollBar.vertical: ScrollBar { id: scrollBar }
    

    и

  2. ScrollBar { id: scrollBar; orientation: Qt.Vertical }
    

Такая же путаница пришла ко мне с кодом ниже:

Flickable {
    anchors.fill: parent

    contentWidth: parent.width * 2
    contentHeight: parent.height * 2

    ScrollBar.horizontal: ScrollBar { id: hbar; active: vbar.active }
    ScrollBar.vertical: ScrollBar { id: vbar; active: hbar.active }
}

В строке anchors.fill: parent, anchors в нижнем регистре.

1 Ответ

0 голосов
/ 08 мая 2019

Я думал, что 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 *
...