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 в качестве корневого типа.