Qt文本编辑器项目:在打开花括号后按Enter会自动缩进

时间:2019-01-15 12:13:43

标签: qt qt5 text-editor auto-indent

我正在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() - 2cursor.position() - 1,但结果还是一样。

在这里我对插入文本和移动光标有什么误解?

0 个答案:

没有答案