MyTetra Share
Делитесь знаниями!
Особенности иерархии при использовании типов 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


и можно не бояться, что придется подправлять код с учетом вложенности если иерархия по каким-то причинам изменится.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования