Проект текстового редактора Qt: авто-отступ, когда Enter нажимается после открывающей фигурной скобки - PullRequest
0 голосов
/ 15 января 2019

Я работаю над проектом текстового редактора в 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;
}

Без кода для установки позиции текстового курсора результат выглядит так:

enter image description here

Курсор заканчивается в строке 4, а в строке 2 есть вкладка. Я намереваюсь переместить курсор так, чтобы он находился справа от вкладки, поэтому я попытался сделать это с помощью написанного мной кода. Но это дает мне это:

enter image description here

Здесь отступ все еще в строке 2, но теперь между вкладкой и закрывающей скобкой есть дополнительная строка, что немного странно.

Еще более странным является то, что это происходит независимо от того, в какую новую позицию я вступаю. Например, я пытался сделать cursor.position() - 2 и cursor.position() - 1 из любопытства, но все равно получил тот же результат.

Что я неправильно понимаю, вставляя текст и перемещая курсор?

...