如何在QPlainTextEdit中清除ExtraSelections

时间:2013-04-21 13:30:17

标签: qt qplaintextedit

很抱歉,如果这是一个新手问题。我有一些代码用于在编辑器中标记错误,我找不到如何在错误消失时清除标记。这是我要求渲染错误的方法。

void Editor::highlightErrors( Thing* t )
{
    if ( !t )
        return; 

    const std::vector<Thing::Error>& errors = t->errors();

    QTextCursor tc = textCursor();
    tc.select(QTextCursor::Document);

    QList<QTextEdit::ExtraSelection> extraSelections;
    for(int i = 0; i < errors.size(); ++i) {
        const Thing::Error& error = errors[i];
        QTextEdit::ExtraSelection sel;
        sel.format = this->errorFormat();
        sel.format.setToolTip(QString(error.error.c_str()));
        sel.cursor = tc;
        sel.cursor.clearSelection();
        sel.cursor.setPosition(error.startPos);
        sel.cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, error.endPos - error.startPos);
        sel.cursor.mergeCharFormat(sel.format);
        extraSelections.append(sel);
    }
    setExtraSelections(extraSelections);
}

我希望QPlainTextEdit在没有错误格式的情况下重绘文本,当调用此方法时没有错误,但事实并非如此。正确调用QTextLayout :: draw并清除额外的选择,但仍然使用错误格式绘制文本。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

对我来说,似乎更像是一个Qt错误。

如果您只是寻找修复/解决方法:

tc.select(QTextCursor::Document);之后添加此内容:

  tc.setCharFormat(textCursor().charFormat());

这应该解决问题。

<强>详情:

这是我用它测试的功能。我只是让函数接受一个int num并将这些char位置格式化为extraSelection并使用自定义格式(不包括上面提到的修复)。

void MainWindow::highlightErrors(int num) {
  QTextCursor tc = ui_.textEdit->textCursor();
  tc.select(QTextCursor::Document);
  QTextCharFormat format;
  QColor lineColor = QColor(Qt::red);
  format.setBackground(lineColor);
  // format.setFontCapitalization(QFont::AllLowercase);
  QList<QTextEdit::ExtraSelection> extraSelections;
  for(int i = 0; i < num; ++i) {
    QTextEdit::ExtraSelection selection;
    selection.format = format;
    selection.format.setToolTip(QString::number(i));
    selection.cursor = tc;
    selection.cursor.clearSelection();
    selection.cursor.setPosition(i);
    selection.cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, 1);
    // selection.cursor.mergeCharFormat(selection.format);
    extraSelections.append(selection);
  }
  ui_.textEdit->setExtraSelections(extraSelections);
}

在上面的代码中,2行被评论。所有这一切都是应用了红色背景。现在这很好用。

但是,如果我们取消注释format.setFontCapitalization(QFont::AllLowercase);并重新运行,我们可以看到后台工作正常,但小写更改未应用(确保它的开头大小)(这是我认为的自格式更改以来的Qt错误仅部分适用)

现在,如果我们也取消注释selection.cursor.mergeCharFormat(selection.format);,我们也可以看到应用了小写格式,但格式删除仍然有效。

因此,当CharFormat() 更改时,我们需要修复以重置整个文档的errorSelection()