|
|||||||
Особенности иерархии при использовании типов Window и ApplicationWindow
Время создания: 10.01.2018 18:10
Текстовые метки: qt, qml, иерархия объектов, доступ, тип, Window, ApplicationWindow
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - QML - Краткая памятка по QML
Запись: xintrea/mytetra_syncro/master/base/1515597043a2e7l5pva8/text.html на raw.github.com
|
|||||||
|
|||||||
Особенности иерархии при использовании типов Window и ApplicationWindow В QML есть типы, традиционно используемые на верхнем уровне: это Window и ApplicationWindow. Особенность в том, что когда в них вставляются другие элементы, то на самом деле эти элементы не вставляются в Window и ApplicationWindow. Вместо этого, у элементов Window и ApplicationWindow есть специальный объект, хранящийся в свойстве contentItem, и имеющий тип ContentItem. Именно этот объект и является корневым (root) элементом Item для всей последующей иерархии, и именно в него вставляются все другие элементы. Например, если имеем такой код: import QtQuick 2.6 import QtQuick.Window 2.2 Window { id: mainWindow visible: true width: 640 height: 480 Rectangle { id: square width: 100 height: 100 color: "gray" } } ... то этот код не означает, что в mainWindow лежит square. Это значит, что в mainWindow лежит невидимый contentItem, а уже в нем лежит square. Важно об этом помнить, потому что если, в нашем случае, нужно обратиться из элемента square именно к объекту окна, то нельзя использовать parent, так как такая запись произведет обращение к невидимому в вышеприведенном коде элементу contentItem. Дело осложняется тем, что contentItem инициируется теми же основными свойствами, что и сам объект окна. И создается впечатление, что при обращении к parent происходит обращение именно к объекту окна, хотя на деле это не так. Когда такая особенность может сыграть злую шутку? Например, когда попытаться обратиться к несуществующему свойству окна. Типы Window и ApplicationWindow отличаются от обычных экранных элементов тем, что они не созданы на основе типа Item как все остальные. А это значит, что, например, у них нет anchor-свойств, к которым можно было бы привязываться. Поэтому невозможно привязывать объекты к окну, используя его идентификатор. Звучит дико, но это так. В следующем коде не сработает привязка к горизонтальному центру: Window { id: mainWindow visible: true width: 640 height: 480 Rectangle { id: square width: 100 height: 100 color: "gray" anchor.left: mainWindow.horizontalCenter } } А если написать так, то сработает: anchor.left: parent.horizontalCenter Как уже стало понятно, это призойдет потому, что при написании parent происходит обращение к contentItem а не к mainWindow. А у невидимого элемента contentItem как раз таки есть anchor-свойства. Теперь встает такой вопрос: как выравнивать какой-нибудь вложенный элемент, который понадобилось выровнять относительно окна? Неужели, нужно будет писать parent.parent.parent... с учетом вложенности, чтобы добраться к contentItem, от которого можно сделать выравнивание? Нет, все гораздо проще. Коль у типа Window есть свойство, которое так и называется contentItem (и тип его - Item), то из глубин иерархии можно обращаться так: anchor.left: mainWindow.contentItem.horizontalCenter и можно не бояться, что придется подправлять код с учетом вложенности если иерархия по каким-то причинам изменится. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|