Как распространяются неявные измерения элементов QtQuick?
Я пытаюсь реализовать компонент, который должен по умолчанию (если нет width
был явно установлен) занимать столько места, сколько ему нужно (т.е. в зависимости от его implicitWidth
). И если width
было определено при определении, что оно должно сжимать его содержимое, чтобы оно соответствовало предоставленной области.
Вот пример:
import QtQuick 2.2
import QtQuick.Window 2.0
Window {
width: 200
height: 100
visible: true
property bool restricted: false
Component {
id: external
FocusScope {
implicitWidth: column.implicitWidth
implicitHeight: column.implicitHeight
focus: true
Column {
id: column
width: parent.width > 0 ? parent.width : undefined
Text {
id: label
width: parent.width > 0 ? parent.width : undefined
elide: Text.ElideRight
font.pixelSize: 24
text: "1234567890"
}
}
Keys.onRightPressed: label.text += label.text
}
}
Loader {
width: restricted ? 100 : undefined
sourceComponent: external
focus: true
Keys.onReturnPressed: restricted = !restricted
}
}
В этом примере два режима управляются вспомогательными bool
свойство, и я хочу, чтобы он поддерживал две формы декларации:
Явная ширина.
Text
должен элиде.Loader { width: 100 sourceComponent: external focus: true }
Loader
Ширина должна быть достаточной для размещения всего текста без исключения.Loader { sourceComponent: external focus: true }
Мотивация заключается в том, что такой компонент будет определен в отдельном файле и предназначен для размещения в разных частях пользовательского интерфейса, причем оба поведения необходимы в зависимости от текущих потребностей. Этот образец с объявлением встроенного компонента предназначен только для демонстрации.
ОБНОВИТЬ:
Следующий трюк parent.width > 0 ? parent.width : undefined
работает, но только для начальной настройки. Если содержимое компонента изменяется и implicitWidth
обновляется (вrestricted
режим) ширина компонента не меняется (т.е. Text
остается исключенным).
Например, нажмите правую клавишу сразу после запуска примера. Вы должны увидеть это Text
стала исключенной, но ее ширина не увеличилась вдвое, несмотря на то, что строка была продублирована.