Я работаю над проектом текстового редактора в Qt, и я добавил следующий метод переопределения к классу типа QPlainTextEdit
:
/* Custom handler for events. Used to handle the case of Enter being pressed after an opening brace.
*/
bool Editor::eventFilter(QObject* obj, QEvent* event)
{
bool isKeyPress = event->type() == QEvent::KeyPress;
if(isKeyPress)
{
QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_Enter || key->key() == Qt::Key_Return)
{
QString documentContents = document()->toPlainText();
if(documentContents.length() >= 1)
{
int indexToLeftOfCursor = textCursor().position() - 1;
if(indexToLeftOfCursor >= 0 && indexToLeftOfCursor < documentContents.length())
{
bool hitEnterAfterOpeningBrace = documentContents.at(indexToLeftOfCursor) == '{';
if(hitEnterAfterOpeningBrace)
{
// TODO determine indentation level of the opening brace
insertPlainText("\n\t\n}");
QTextCursor cursor = textCursor();
cursor.setPosition(cursor.position() - 3);
setTextCursor(cursor);
}
}
}
}
else
{
return QObject::eventFilter(obj, event);
}
}
else
{
return QObject::eventFilter(obj, event);
}
return false;
}
Без кода для установки позиции текстового курсора результат выглядит так:
Курсор заканчивается в строке 4, а в строке 2 есть вкладка. Я намереваюсь переместить курсор так, чтобы он находился справа от вкладки, поэтому я попытался сделать это с помощью написанного мной кода. Но это дает мне это:
Здесь отступ все еще в строке 2, но теперь между вкладкой и закрывающей скобкой есть дополнительная строка, что немного странно.
Еще более странным является то, что это происходит независимо от того, в какую новую позицию я вступаю. Например, я пытался сделать cursor.position() - 2
и cursor.position() - 1
из любопытства, но все равно получил тот же результат.
Что я неправильно понимаю, вставляя текст и перемещая курсор?