Как распространяются неявные измерения элементов 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 свойство, и я хочу, чтобы он поддерживал две формы декларации:

  1. Явная ширина. Text должен элиде.

    Loader {
        width: 100
        sourceComponent: external
        focus: true
    }
    
  2. Loader Ширина должна быть достаточной для размещения всего текста без исключения.

    Loader {
        sourceComponent: external
        focus: true
    }
    

Мотивация заключается в том, что такой компонент будет определен в отдельном файле и предназначен для размещения в разных частях пользовательского интерфейса, причем оба поведения необходимы в зависимости от текущих потребностей. Этот образец с объявлением встроенного компонента предназначен только для демонстрации.

ОБНОВИТЬ:

Следующий трюк parent.width > 0 ? parent.width : undefined работает, но только для начальной настройки. Если содержимое компонента изменяется и implicitWidth обновляется (вrestricted режим) ширина компонента не меняется (т.е. Text остается исключенным).

Например, нажмите правую клавишу сразу после запуска примера. Вы должны увидеть это Text стала исключенной, но ее ширина не увеличилась вдвое, несмотря на то, что строка была продублирована.

0 ответов

Другие вопросы по тегам