我正在尝试将日志数据传递到我的QML前端,一次一行,并将其附加到TextArea的末尾。我考虑过几种方法。下面是最有希望的。我已经创建了一个QAbstractListModel (Python语言),并将此模型传递到一个中继器中,在中继器中作为单个项(rowCount =1)到达,并使用下面的代码行将其附加到TextArea中
text: terminal_text.text + display
这是可行的,但每次文本更新时,我都会收到此警告。
file://.../TextArea.qml:728:9: QML QQuickTextEdit*: Binding loop detected for property "text"
有关中继器的代码,请参阅以下内容。
Repeater {
model: TerminalFeed { }
delegate: TextArea {
id: terminal_text
font.family: "Courier"
width: parent.width
height: parent.height
readOnly: true
selectByMouse: true
wrapMode: TextEdit.NoWrap
horizontalScrollBarPolicy: Qt.ScrollBarAsNeeded
verticalScrollBarPolicy: Qt.ScrollBarAsNeeded
text: terminal_text.text + display
}
}
我怎样才能阻止这种情况的发生呢?或者,有没有人有更好的方法来达到同样的结果?
发布于 2020-05-02 22:40:51
从技术上讲,这确实是一个绑定循环,因为text
依赖于它自己的值。如果QML没有检测到它并破坏它,将导致无限循环的更新。
您可以这样做,而不是使用绑定:
Repeater {
model: TerminalFeed { }
delegate: TextArea {
id: terminal_text
font.family: "Courier"
width: parent.width
height: parent.height
readOnly: true
selectByMouse: true
wrapMode: TextEdit.NoWrap
horizontalScrollBarPolicy: Qt.ScrollBarAsNeeded
verticalScrollBarPolicy: Qt.ScrollBarAsNeeded
onDisplayChanged: {
text = text + display;
}
}
}
使用最初的绑定方法,它将尝试并在display
或text
发生更改时进行更新。使用这种方法,它只会尝试在display
发生变化时进行更新--这才是您真正想要的。
发布于 2021-05-23 20:52:50
我遇到了一个类似的问题,我想在QML窗口中显示记录的数据。
我使用从QML TextField继承的insert()
方法。插入位置是TextArea
的长度。
TextArea {
id: outputTextArea
}
Component.onCompleted: {
data = "dummyString"
outputTextArea.insert(outputTextArea.length, data)
}
https://stackoverflow.com/questions/61555771
复制相似问题