Как изменить размер метки QML в соответствии с высотой содержимого? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть несколько экземпляров объекта Label, созданного в цикле.У каждого из них свой текст.Если текст достаточно длинный, он обрезается.

Что мне нужно сделать, это установить высоту метки, чтобы она превышала высоту содержимого, чтобы весь текст был виден.

Я понял, что могу сделать следующее: height: contentHeight + Theme.paddingMedium, чтобы достичь своей цели, но это решение вызывает предупреждение QML Label: Binding loop detected for property "height".

Мне интересно, есть ли способ правильно изменить размерметка без предупреждающего сообщения.

Я пытался поместить код установки высоты в различные обработчики сигналов (onContentSizeChanged, onTextChanged и т. д.) и 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
}

И что интересно, некоторые более длинные тексты показаны полностью, а более короткие - обрезаны.Я думаю, что это какой-то угловой случай, в который попало всего несколько сообщений.

...