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

时间:2020-06-17 09:22:49

标签: c++ qt qtextedit

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

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

但是我发现能够以中性样式附加文本很方便。

导致我的问题的原因是: 我有一个QTextEdit形式的日志窗口,在其中添加文本(通常是中性的,但某些元素可能是彩色的,等等)。由于它是出于日志目的,因此QTextEdit是只读的,并且文本元素始终添加在末尾( append())。只要用户从不单击文本,就可以了。单击QTextEdit的一部分时,光标位置将更改。由于我使用append()在结尾插入文本,即使光标在其他位置,该位置也不是问题。但是,如果用户单击具有非中性样式的内容,则后面附加的文本也将具有此样式,这是不希望的。

对我来说有趣的是,要么阻止光标以使用户无法篡改样式,要么在不将样式基于当前段落的基础上追加样式。

除了子类化QTextEdit之外,还有其他方法可以改变这种行为吗?

如前所述,我可以在执行任何append()之前检查光标位置(如果已经移动了光标,则将其设置在文档的末尾),但是如果存在的话,我希望使用更“全局”的解决方案。

1 个答案:

答案 0 :(得分:1)

我试图在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();
}

输出:

snapshot of MCVE

因此,一种可能的解决方法是提供带有标记的文本。

如果只是纯文本,最简单的解决方案是将其包装在"<p>""</p>"中。

顺便说一句。如果只是纯文本,我建议您根据Supported HTML Subset进行一些其他调整,以使其适合HTML。 就是说,我会像我一样搜索并替换通常的XML元字符。在我对SO: qt plaintextedit change message color的回答中。