QML: Компонент vs Предмет как контейнер
В чем разница между Component
и Item
в QML? Документация здесь не совсем понятна.
Какой предпочтительный тип использовать в качестве контейнера для нескольких виджетов?
Может ли он быть заменяемым на Rectangle
?
Например, в чем разница в следующих объявлениях:
Item {
id: itemWidget
Rectangle { id: one }
Rectangle { id: two }
}
и
Component {
id: componentWidget
Rectangle { id: one }
Rectangle { id: two }
}
Почему мы обычно используем Component
при объявлении delegate
?
Ответы
Ответ 1
Разница между этими двумя фрагментами заключается в том, что Rectangle
будет немедленно отображаться. Это написано в документации:
Обратите внимание: если прямоугольник сам по себе будет автоматически отображаться и отображаться, это не относится к указанному выше прямоугольнику, потому что он определен внутри Компонента. Компонент инкапсулирует QML-типы внутри, как если бы они были определены в отдельном файле QML, и не загружается до тех пор, пока не будет запрошен (в данном случае, двумя объектами Loader). Поскольку Component не является производным от Item, вы не можете привязывать к нему что-либо.
При объявлении делегатов используется Component
, потому что необходимо создать несколько элементов делегата. Здесь не работает один Item
. Вы можете представить Component
как шаблон, из которого вы можете создавать объекты.
Ответ 2
A Component
- это и понятие, и вещь в QML. Item
- это визуальная вещь, определенная в модуле QtQuick, которая может использоваться в QML. Эти две вещи концептуально отличаются.
Как и в концепции QML, все многократно используемые компоненты называются компонентами. Вы можете определить компонент несколькими способами, но один простой способ - создать файл .qml
и называть его именем вашего компонента. i.e: Button.qml или Swithc.qml. Когда двигатель QML загружает этот файл, вы можете использовать его как кнопки или переключатели.
Другим способом определения компонента является использование Component {}
в qml файле. Это позволяет вам определить новый компонент inline. Компонент, определенный в строке, не работает после явно загруженного loader.
An Item
, с другой стороны, является простым типом, определенным в модуле QtQuick.
Я думаю, что это нормально, чтобы вызвать Item
a Component
, даже если Item
не унаследован от технологии Component
. Или, точнее, вы могли бы сказать, что ваш пользовательский компонент основан на Item
, если ваш .qml
имеет Item
в качестве корневого типа.