使QT / QML TextArea滚动到底部

时间:2019-07-26 15:35:33

标签: qt qml qt5

在QT / QML 5.11上,我很难过这么简单的事情,我几乎认为此时库中存在错误。

我有以下代码:

Flickable {
    id: txflick
    anchors.top: title_label.bottom
    anchors.bottom: crect.bottom
    anchors.right: crect.right
    anchors.left: busy_ind.right

    flickableDirection: Flickable.VerticalFlick

    onContentYChanged: console.log("contentY_changed", this.contentY)
    //contentY: txarea.contentHeight - txarea.height
    interactive: false // Has no effect, contentY keeps changing to zero

    TextArea.flickable: TextArea {
        id: txarea

        topPadding: 8
        bottomPadding: 10
        leftPadding: 10
        rightPadding: 10
        readOnly: true
        text: menu_view.pwrcon.text

        onTextChanged: {
            console.log("text changed")
            txflick.contentY = txarea.contentHeight - txflick.height
            console.log("chg", txarea.contentHeight - txflick.height)
            console.log(text)
        }

        onContentHeightChanged: {
            console.log("ctheight = ___", contentHeight, height, txflick.height, txflick.contentHeight)
        }

        font.family: "DejaVu Sans Mono,Ubuntu Sans Mono,Noto Sans Mono"
        font.bold: false
        font.pixelSize:12
        color: "black"
        //verticalAlignment: TextInput.AlignTop
        background: Rectangle { color: "lightgrey"; radius: 2;
            border.width: 1; border.color: "darkgrey" }
    }
}

基本上,TextArea的文本链接到“ menu_view.pwrcon.text”,在Python代码中对其进行了更改(这是一个属性)。当文本更改时,我希望它将可滑动控件设置为文本底部,以便我们看到最近添加的行。

我愿意

txflick.contentY = txarea.contentHeight - txflick.height

触发onTextChanged()事件时。那里没有问题,我检查了数字就可以了(手动滚动到console.log()所示的数字表明contentY计算正确)。

但是似乎组件(可轻弹)在我更改contentY之后,将其单独更改回0(此行为仅在文本高度大于可轻弹的固定高度之后发生)。真是愚蠢,我怀疑这是错误还是故意的。

换句话说,在我计算之后,contentY在没有我干预的情况下神奇地恢复为零,这当然会破坏整个事情。

有什么要解决的问题吗?

1 个答案:

答案 0 :(得分:0)

您可以使用Flickable或ScrollView来实现。

在TextArea中将光标位置更改为会自动聚焦在该行上。

在文本区域中创建一个函数,并在每次文本更改时更改焦点。您必须手动调用

const static auto do_nothing = [](auto &&){};
// Requires C++14, if you have C++17 available, use
constexpr auto do_nothing = [](auto &&){};

或 您可以直接设置属性

 cursorPosition = length-1

在每次文本更新时在TextArea块中。

cursorPosition : length-1