如何调整QML标签的大小以匹配内容高度?

时间:2019-03-03 22:59:53

标签: qml qtquick2 sailfish-os

我有一个循环中创建的Label对象的多个实例。他们每个人都有不同的文字。如果文本足够长,它将被剪切。

我需要做的是将标签的高度设置为大于其内容高度,以便整个文本可见。

我想我可以做到:height: contentHeight + Theme.paddingMedium实现我的目标,但是此解决方案会触发QML Label: Binding loop detected for property "height"警告。

我想知道是否有一种方法可以正确调整标签的大小而不发出警告消息。

我尝试将高度设置代码放入各种信号处理程序(onContentSizeChangedonTextChanged等)和Component.onCompleted中,但是尽管执行了处理程序,但文本仍被剪切。
我还尝试使用Connections对象,但是它只抱怨不存在的属性。


编辑: 这是我在做什么的例子。
我有一个页面,大致这样定义

Page {
    // only for getting the data
    Connections {
        target: api
        onMessagesChanged: mmlv.model = api.messages
        // api.messages is based off QAbstractListModel
    }
    // end of data fetching code

    SilicaListView {
        id: mmlv
        width: parent.width
        anchors.fill: parent
        clip: true
        spacing: Theme.paddingMedium
        delegate: MMDelegate {
            width: ListView.view.width*0.75
        }

        VerticalScrollDecorator {}
    }
}

然后,MMDelegate.qml用于用标签填充视图:

ListItem {
    contentHeight: column.height + Theme.paddingLarge

    Component.onCompleted: ldr.setSource("TextMessage.qml", {"text": model.message})

    Column {
        id: column
        width: parent.width
        spacing: Theme.paddingSmall
        anchors.verticalCenter: parent.verticalCenter

        Loader {
            id: ldr
            width: parent.width
        }
    }

    Rectangle {
        z: -1
        anchors.fill: parent
        color: Theme.secondaryHighlightColor
    }
}

最后,在TextMessage.qml文件中定义了单个标签:

Label {
    width: parent.width
    anchors {
        left: parent.left
        leftMargin: Theme.paddingMedium
        right: parent.right
        rightMargin: Theme.paddingMedium
    }
    wrapMode: Text.WordWrap
//    height: contentHeight + Theme.paddingMedium
}

有趣的是,完整显示了一些较长的文本,但剪切了较短的文本。我认为这是一种极端情况,只有几条消息出现。

0 个答案:

没有答案