Запомнить положение прокрутки в элементе 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.

надеюсь, что это помогает