如何管理关于子 QML TextEdit 的 QML ScrollView 导航?

How to manage QML ScrollView navigation with respect to child QML TextEdit?

我有一个 TextEdit inside a Scrollview inside a SplitView. I have a Q_INVOKABLE function that I call when a row in a TableView 被选中以跳转到 TextEdit 中的所需行,这工作正常。但是,我需要调整 ScrollView 焦点,以便它在 TextEdit 的选择移动时移动。 与在 IDE 上选择编译错误的行为相同。

//main.qml

ScrollView {
    id: palGenTextScrollView
    anchors.fill: parent

    TextEdit {
        id: mainTextEdit
        text: fileio.palFileText
        wrapMode: TextEdit.Wrap
        selectByMouse: true
    }

TableView {
    id: errorsTableView
    onClicked: {
        mainTextEdit.select(palerrorviewmodel.goToLine(errorsTableView.currentRow),
                            palerrorviewmodel.goToLine(errorsTableView.currentRow))
        mainTextEdit.forceActiveFocus()
        //Call something to adjust ScrollView here
        //palGenTextScrollView. ??
}

我省略了一些不相关的代码。

您需要使用palGenTextScrollView.flickableItem.contentY来设置文本的位置。下面是一个小例子:文本的每一行都有一个按钮,单击它会选择该行并将文本居中。您可以针对自己的问题进行处理。

由于缺少 palerrorviewmodel 元素,我无法使您的示例正常工作。

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    ScrollView {
        id: palGenTextScrollView
        width: 200
        height: 100

        TextEdit {
            id: mainTextEdit
            text: "I have a TextEdit\ninside a Scrollview\ninside a SplitView.\nI have a Q_INVOKABLE\nfunction that I call\nwhen a row in a TableView\ngets selected to jump\nto a desired line\nin the TextEdit,\nthis works fine.\nHowever, I need to adjust\nthe ScrollView focus\nso that it moves\nwhen the selection\nof the TextEdit moves.\nIdentical behavior\nto selecting a compiling\nerror on an IDE."
            wrapMode: TextEdit.Wrap
            selectByMouse: true
        }
    }

    Row{
        spacing: 5
        anchors.top: palGenTextScrollView.bottom
        anchors.topMargin: 20

        Repeater{
            model: mainTextEdit.lineCount

            delegate: Rectangle{
                width: 20
                height: 20
                color: "blue"
                Text{
                    anchors.centerIn: parent
                    text: index
                }

                MouseArea{
                    anchors.fill: parent
                    onClicked: {
                        var lines = mainTextEdit.text.split("\n");
                        var count=0;
                        for (var i=0; i<index;i++){
                            count+=(lines[i].length+1);
                        }
                        mainTextEdit.select(count, count+lines[index].length);
                        mainTextEdit.forceActiveFocus()

                        var maxY = mainTextEdit.contentHeight-palGenTextScrollView.height
                        var lineHeight = mainTextEdit.contentHeight/mainTextEdit.lineCount
                        var centeredY=index*lineHeight-palGenTextScrollView.height/2
                        if (centeredY < 0){
                            palGenTextScrollView.flickableItem.contentY=0
                        }else if (centeredY<=maxY){
                            palGenTextScrollView.flickableItem.contentY=centeredY
                        }else{
                            palGenTextScrollView.flickableItem.contentY=maxY
                        }
                    }
                }
            }
        }
    }
}