我有一个循环中创建的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
}
有趣的是,完整显示了一些较长的文本,但剪切了较短的文本。我认为这是一种极端情况,只有几条消息出现。