Текстовая область, обрабатывайте каждый символ по одному за раз

#qt #qml

Вопрос:

У меня есть текстовая область, и я хочу прослушивать все введенные в нее символы, я пытаюсь сделать так, чтобы при нажатии клавиши пробела я выполнял операцию или обработку, например, заменял некоторые символы на ней. Я попытался прослушать onTextChanged, однако это может привести к рекурсии, так как установка моего TextArea.text на новое значение вызывает вызов события onTextChange, что приводит к переполнению стека.

Я также пытался прослушать событие Keys.onPressed и прослушать клавишу пробела, но клавиша пробела также обрабатывается, и когда я устанавливаю новое текстовое значение, значение пробела принудительно вставляется. Как и где я должен наблюдать и слушать эти события?

  1. Как я могу прослушать каждый введенный символ в текстовой области QML, поймать пробел, обработать и заменить текст новым обработанным текстом? Также игнорируйте последнюю запись с пробелом?
  2. Как отклонить символ при вводе в TextEdit или TextArea?

Комментарии:

1. Почему бы вам не использовать QSignalBlocker при обработке текста, чтобы избежать бесконечной рекурсии?

2. Вы можете написать свой собственный QValidator, где вам нужно переопределить метод QValidator::validate(QString amp;input, int amp;pos) const. Если вы измените входную строку, то она также заменит текст, написанный пользователем. Этот подход включает в себя C , но вы в наибольшей степени контролируете его.

Ответ №1:

Можете ли вы использовать TextInput то, что помогает вам различаться, изменяется ли текст пользователем или программно ?

 import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12

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


    TextInput
    {
        width: 200
        height: 100

        onTextEdited:
        {
            if( text[text.length-1] === " " )
            {
                text = process(text)
            }
        }

        anchors.centerIn: parent
    }


    function process(textinput)
    {
        return textinput.toUpperCase()
    }
}