QML TextArea滚动事件

时间:2015-04-08 19:37:35

标签: qt qml qt-quick qtquickcontrols

有没有办法知道TextArea滚动到达顶部或底部的时间?我想在聊天客户端中实现动态文本加载:当用户滚动到顶部时,会向文档中添加更多文本。像这样的东西(伪代码):

import QtQuick 2.4
import QtQuick.Controls 1.2

TextArea {
      id: chat
      onScrolledToTop: text = loadMoreText() + text
}

2 个答案:

答案 0 :(得分:3)

Textarea继承自ScrollView,其中Flickable项用于控制可见区域。这样的项目可用作(只读)属性flickableItem。在其他属性中,Flickable提供contentY

  

这些属性保持当前位于左上角的曲面坐标   Flickable的一角。例如,如果您向上滑动图像100   像素,contentY将是100。

因此,您可以检查此属性更改,并在达到特定阈值后更新您的文本。请注意,您应在设置文本后调整contentY,以模拟添加。否则,显示的文本将完全是刚刚添加的文本。 OP提出的一个好方法是保存原始contentHeight并将contentY设置为更新的contentHeight与保存的threshold之间的差异 - 同时考虑应用{ {1}}。

import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Controls 1.3

Window {
    visible: true
    width: 400
    height: 200

    TextArea {
        id: chat
        anchors.fill: parent
        property int threshold: 10

        text: "Current\ntext\n\\to\nmove\ndown\ndown\ndown
               \ndown\ndown\ndown\ndown\ndown\ndown\ndown"
        Component.onCompleted: cursorPosition = text.length


        flickableItem.onContentYChanged: {
            if(flickableItem.contentY <= threshold) {
                var oldHeight = flickableItem.contentHeight
                text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit,
                            sed do eiusmod tempor incididunt ut labore et dolore magna
                            aliqua." + text
                flickableItem.contentY = threshold + flickableItem.contentHeight - oldHeight  // leave flickable in old position
            }
        }
    }
}

答案 1 :(得分:0)

ScrollView {
        width: root.width - ((root.width/10) * 2) - (root.width/15)*2
        x:  (root.width/10) + root.width/15
        height: root.height - (root.height/5)
        clip: true

        TextArea {
            id: textArea
            clip: true
            width: root.width - ((root.width/10) * 2) - (root.width/15)*2
            height: root.height - (root.height/5)
            wrapMode: "WrapAtWordBoundaryOrAnywhere"
            placeholderText: "inter description"
        }
    }