Запомнить положение прокрутки в элементе QML
у меня есть qml, который действует как выход из приложения (вроде как консоль только для чтения). Тем не менее, это раздражает, потому что при печати информации он прокручивается обратно наверх.
например, скажем, я печатаю строку в my TextArea
каждую секунду, через минуту или около того, у меня будет достаточно линии, что теперь у меня есть полоса прокрутки. Я прокручиваю вниз, секундой позже печатается строка текста, заставляя ее прокручиваться обратно наверх.
нужные функциональность я хотел бы автоматически прокручивать вниз (так же, как консоль, когда она печатает материал), если пользователь не переопределяет это, прокручивая вверх, то текст должен оставаться на месте. Надеюсь, это имело смысл, вот какой код:
ScrollArea {
id: helpTextScrollArea
anchors.left: parent.left
anchors.right: parent.right
anchors.top: myButton.bottom
anchors.topMargin: 5
anchors.bottom: parent.bottom
visible: false
horizontalScrollBar.visible: false
onVisibleChanged: {
helpText.visible = visible
}
HelpTextArea {
id: helpText
width: parent.parent.width - helpTextScrollArea.verticalScrollBar.width
text: "Oops, no documentation."
onVisibleChanged: {
if(helpTextScrollArea.visible != visible) {
helpTextScrollArea.visible = visible
}
}
}
}
Flickable
{
id: flick
anchors.left: parent.left
anchors.right: parent.right
anchors.top: runStopButton.bottom
anchors.bottom: parent.bottom
anchors.topMargin: 5
TextArea{
id: messageArea
anchors.fill: parent
focus: true
readOnly: true
visible: !helpTextScrollArea.visible
wrapMode: TextEdit.Wrap
function addText(newText) {
text += newText + "n"
}
}
}
примечание: Я не думаю, что мой Flickable ничего не делает, это было частью моих экспериментов, чтобы решить проблему. Кроме того, я использую функцию addText
для печати текстовой области. Я почти ничего не знаю о qml, и большая часть этого кода была написано кем-то другим и я пытаюсь работать с ним. Спасибо!
3 ответов
вы можете связать contentY
собственность Flickable
к выражению, которое вычислит правильную позицию.
Flickable {
id: flick
states: State {
name: "autoscroll"
PropertyChanges {
target: flick
contentY: messageArea.height - height
}
}
onMovementEnded: {
if (contentY === messageArea.height - height) {
state = "autoscroll"
}
else {
state = "" // default state
}
}
// ...
}
Flickable имеет 4 свойства только для чтения в вызванном visibleArea.* (вы можете прочитать их значение в документации QML):
- visibleArea.xPosition : xPosition = contentX / contentWidth
- visibleArea.yPosition: yPosition = contentY / contentHeight
- visibleArea.widthRatio: widthRatio = width / contentWidth
- visibleArea.heightRatio : heightRatio = высота / contentHeight
Если вы используете GridView вместо Flickable, вы можете использовать эти методы.
positionViewAtBeginning()
positionViewAtEnd()
positionViewAtIndex(int index, PositionMode mode)
Я нашел их очень полезными, так как при добавлении строки текста просто вызовите positionViewAtEnd()
метод внутри GridView.
надеюсь, что это помогает