如何在不使用当前段落样式的情况下附加到 QTextEdit

How to append to QTextEdit without using the current paragraph style

使用myQTextEdit.append()时插入文字的样式如下(Qt 5.14文档):

"追加的新段落将具有与当前段落相同的字符格式和块格式,具体取决于光标的位置。"

不过,我会发现能够使用 中性 样式附加文本会很方便。

导致我出现问题的原因是: 我有一个 QTextEdit 形式的日志 window,我在其中附加文本(大部分是中性的,但某些元素可能是彩色的,等等)。由于它是用于日志目的,QTextEdit 是只读的,文本元素总是添加在末尾 (append())。这很好,只要用户从不点击文本。单击 QTextEdit 的一部分时,光标位置会发生变化。这不是位置问题,因为我使用 append() 在末尾插入文本,即使光标在其他地方也是如此。但是,如果用户点击的是非中性风格的东西,那么后面追加的文字也会是这种风格,这是不可取的。

对我来说有趣的是要么阻止光标以便用户不能篡改样式,要么在不将样式基于当前段落的情况下进行追加。

除了通过子类化 QTextEdit 之外,有没有办法改变这种行为?

如前所述,我可以在执行任何 append() 之前检查光标位置(如果它已被移动,则将光标设置在文档的末尾)但如果它存在,我更喜欢 "global"解决方案。

我试图在 MCVE 中重现 OP 描述的内容:

// Qt header:
#include <QtWidgets>

// main application
int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QTextEdit qTextEdit;
  qTextEdit.show();
  // populate text editor
  qTextEdit.append(QString::fromUtf8(
    "<p>This is some text...</p>"
    "<p style='color: red'>...followed by more red text...</p>"
    "<p style='color: blue; font-weight: bold'>...followed by more fat blue text.</p>"));
  // test QTextEdit::append() like described by OP:
  qTextEdit.setTextCursor(QTextCursor(qTextEdit.document()->findBlockByNumber(1)));
  qTextEdit.append("TEST. (Reproduce what OP described.)");
  qTextEdit.append("<p>TEST. (A possible fix.)</p>");
  // runtime loop
  return app.exec();
}

输出:

因此,一个可能的解决方法是提供要附加标记的文本。

如果它只是原始文本,最简单的解决方案是将其包装在 "<p>""</p>".

顺便说一句。如果它只是原始文本,我会建议根据 Supported HTML Subset 进行一些额外的调整以使其正确 HTML。 也就是说,我会像我那样搜索并替换通常的 XML 元字符,例如在我对 .

的回答中