QtQuick项的隐式维度如何传播?

时间:2015-01-23 16:33:00

标签: qml qtquick2 qqmlcomponent

我正在尝试实现一个默认情况下应该(如果没有显式设置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
    }
    
  3. 动机是这样的组件将在一个单独的文件中定义,并且被设计为根据当前需要放置在UI的不同部分中。此内联组件声明示例仅用于演示目的。

    更新

    以下技巧parent.width > 0 ? parent.width : undefined有效,但仅适用于初始设置。如果组件内容发生更改并且implicitWidth已更新(在非restricted模式下),则组件的宽度不会更改(即Text仍然被省略)。

    例如,在启动示例后立即按右键。您应该看到Text已被删除,但其宽度没有增加 两次,不管字符串是否重复。

0 个答案:

没有答案