#qt #qml
Вопрос:
У меня есть текстовая область, и я хочу прослушивать все введенные в нее символы, я пытаюсь сделать так, чтобы при нажатии клавиши пробела я выполнял операцию или обработку, например, заменял некоторые символы на ней. Я попытался прослушать onTextChanged, однако это может привести к рекурсии, так как установка моего TextArea.text на новое значение вызывает вызов события onTextChange, что приводит к переполнению стека.
Я также пытался прослушать событие Keys.onPressed и прослушать клавишу пробела, но клавиша пробела также обрабатывается, и когда я устанавливаю новое текстовое значение, значение пробела принудительно вставляется. Как и где я должен наблюдать и слушать эти события?
- Как я могу прослушать каждый введенный символ в текстовой области QML, поймать пробел, обработать и заменить текст новым обработанным текстом? Также игнорируйте последнюю запись с пробелом?
- Как отклонить символ при вводе в 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()
}
}