Qt 5 QPlainTextEdit突出显示当前行在“撤消”后失败

时间:2013-11-01 01:53:23

标签: c++ qt

我正在使用Qt5编写一个简单的文本编辑器程序。我的编辑器组件是QPlainTextEdit的子类,对于一些基本功能,我从this Qt demo program窃取了一些代码。似乎相互干扰的两个功能是突出显示编辑器当前行的代码(它连接到文本编辑的cursorPositionChanged()信号,就像演示节目一样):

QList<QTextEdit::ExtraSelection> es;
QTextEdit::ExtraSelection selection;

selection.format.setBackground(currentLineHighlight);
selection.format.setProperty(QTextFormat::FullWidthSelection, true);

selection.cursor = textCursor();
selection.cursor.clearSelection();

es.append(selection);
setExtraSelections(es);

我编写的代码用于执行非常常见的“在选中多行时按Tab键缩进所有行”事情:

QTextCursor curs = textCursor();

if(!curs.hasSelection())
    return;

// Get the first and count of lines to indent.

int spos = curs.anchor(), epos = curs.position();

if(spos > epos)
{
    int hold = spos;
    spos = epos;
    epos = hold;
}

curs.setPosition(spos, QTextCursor::MoveAnchor);
int sblock = curs.block().blockNumber();

curs.setPosition(epos, QTextCursor::MoveAnchor);
int eblock = curs.block().blockNumber();

// Do the indent.

curs.setPosition(spos, QTextCursor::MoveAnchor);

curs.beginEditBlock();

for(int i = 0; i <= (eblock - sblock); ++i)
{
    curs.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor);

    curs.insertText("\t");

    curs.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor);
}

curs.endEditBlock();

// Set our cursor's selection to span all of the involved lines.

curs.setPosition(spos, QTextCursor::MoveAnchor);
curs.movePosition(QTextCursor::StartOfBlock, QTextCursor::MoveAnchor);

while(curs.block().blockNumber() < eblock)
{
    curs.movePosition(QTextCursor::NextBlock, QTextCursor::KeepAnchor);
}

curs.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);

setTextCursor(curs);

这两个功能都很有效 - 至少在大多数情况下都是如此。当我执行以下操作时,似乎有一个奇怪的错误涉及这两个:

  1. 选择几行,然后点击标签,按照我的预期缩进它们。
  2. 撤消该操作。
  3. 此时,在缩进的行集的最后一行,行高亮不会像通常那样一直延伸到编辑器 - 它只延伸到行的末尾。如果我将光标移动到该行的末尾然后点击“Enter”,它就可以解决问题。

    我尝试了几种方法来尝试诊断此问题,包括尝试移动光标和/或锚定而不是仅仅在高亮显示功能中调用clearSelection(),并尝试检查/遍历{构成编辑文档的{1}}试图找出一些差异,但此时我不知所措。我根本无法使这段代码按照我期望的方式运行。

    我发现现在渲染错误的行可以“修复”,但要么在该行中添加任何字符,要么调整窗口大小。

    此外,如果我在缩进功能结束时删除QTextBlock调用,则仍会出现此错误。

    这两件事让我相信这个错误与文本光标或文档内容无关,所以此时我倾向于认为它是Qt渲染额外选择的一个错误。 / p>

    有谁知道我哪里出错了?

1 个答案:

答案 0 :(得分:0)

这实际上是Qt中的一个错误,而不是OP中的代码问题。请参阅QTBUG-30051 - QTextCursor and beginEditBlock breaks layout