每次单击qml TextInput时如何指定光标位置?

时间:2019-07-18 16:25:17

标签: qt qml

我正在尝试解决用户用手指指定光标位置的问题。例如,假设我的用户没有鼠标,他们想完全删除一个字符串,然后将其替换为新的字符串。因此,他们按下(单击)TextInput框,然后光标将它们放在字符串的中间。那他们怎么办?好吧,他们要么删除字符串的前半部分,然后再次单击该框(这一次试图降落在字符串的末尾),要么立即再次单击以尝试降落在字符串的末尾。

对于视力不好和手指发胖的人,我感到非常沮丧。没关系,他们尝试在拖拉机上执行此操作的可能性很大,在光线不佳,视力不好和手指发胖的情况下,在开阔的田野周围弹跳。

相反,我希望光标始终位于当前字符串的末尾,但是我似乎找不到使用TextInput做到这一点的好方法。我找到了使用按钮的解决方法:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.VirtualKeyboard 2.4
import QtQuick.Controls 2.5

Window {
id: window
visible: true
width: 640
height: 480

Item{
    id: thisItemHere
    anchors.centerIn:  parent

    Button {
        id: button
        anchors.centerIn: parent
        text: qsTr("Button")
        onClicked: inputItem.forceActiveFocus()
    }

    TextInput{
        id:inputItem
        text: "Enter text here"
        visible: false

        EnterKeyAction.enabled: inputItem.text.length > 0 || inputItem.inputMethodComposing
        EnterKeyAction.label: "Next"

        Keys.onReleased: {
            if (event.key === Qt.Key_Return) {
                button.text = inputItem.text
                console.log(inputItem.text)
                //activeFocus = false not working...
            }
        }

        onActiveFocusChanged: {
            if(activeFocus) {
                inputPanelContainer.textDisplay = inputItem.text
            }
        }

        onDisplayTextChanged: {
            inputPanelContainer.textDisplay = text
        }
    }
}

InputPanelContainer {
    id: inputPanelContainer
    x: 0
    y: window.height
 }
}

我不喜欢不得不变通。我尝试使用全选功能:

onActiveFocusChanged: {
        selectAll()
        if(activeFocus) inputPanelContainer.textDisplay = inputItem.text
    }

但是我认为,要使此功能有效,我需要找到一种结束焦点的好方法,因为目前,我似乎无法弄清楚一旦用户完成了字符串的编辑后如何结束焦点,因此仅在第一个提示中突出显示该焦点相互作用。换句话说,按Enter键后,光标仍在文本框中,闪烁。

所以也许有人可以告诉我结束焦点的正确方法,或者有人可以告诉我如何使用moveCursorSelection()或TextInput的其他属性,信号或方法,这将导致光标位置始终在末尾用户单击TextInput框后该字符串的内容?

1 个答案:

答案 0 :(得分:1)

为什么您要尝试自己获取Return键?

为此,我总是使用已经存在的onEditingFinished signal,它可以正常工作。

activeFocus 是只读属性,因此确实无法正常工作。您可以尝试在 thisItemHere 项甚至top-Window上强制ActiveFocus,以释放TextInput的焦点。

还可以查看cursorPosition属性吗?获得焦点时将其设置为 inputItem.length ,应该起作用吗?