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

Posted

技术标签:

【中文标题】如何在不使用当前段落样式的情况下附加到 QTextEdit【英文标题】:How to append to QTextEdit without using the current paragraph style 【发布时间】:2020-06-17 09:22:49 【问题描述】:

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

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

不过,我会发现能够以 neutral 样式附加文本很方便。

导致我的问题的原因是: 我有一个 QTextEdit 形式的日志窗口,我在其中附加文本(大部分是中性的,但某些元素可能是彩色的,等等)。由于它是用于日志目的,QTextEdit 是只读的,并且文本元素总是添加到最后(append())。只要用户从不点击文本就可以了。当点击 QTextEdit 的一部分时,光标位置会改变。这不是该位置的问题,因为我使用了在末尾插入文本的 append(),即使光标在其他地方也是如此。但是,如果用户点击了非中性样式的内容,那么随后附加的文本也将具有这种样式,这是不可取的。

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

除了继承 QTextEdit 之外,有没有办法改变这种行为?

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

【问题讨论】:

也许,可能需要更多的努力:QTextCursor::inserthtml() 其中QTextCursor 之前设置为文档结尾。 (我相信这可能是QTextEdit::textCursor() 的副本,以将视觉光标保持在其原始位置。) 是的,我可以在每次插入文本之前将光标设置到文档末尾以避免不必要的样式效果。令我惊讶的是,没有办法“阻止”用户/单击光标修改(即使在只读 QTextEdit 上)。 你能提供一个minimal reproducible example吗?我不确定我是否完全理解你的意图。 我用更多细节编辑了文本,我认为这使意图更清晰。如果没有,我将尝试提供一个最小的可重现示例(但问题主要是由用户/人与图形元素的交互引起的,这在代码示例中很难说明)。 在创建一个非常清晰的 MCVE 方面做得很好,事实证明它更清楚地反映了我认为可能的问题。我这边要记住的事情! 【参考方案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();

输出:

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

如果它只是原始文本,最简单的解决方案是将其包装在 "&lt;p&gt;""&lt;/p&gt;" 中。

顺便说一句。如果它只是原始文本,我建议根据Supported HTML Subset 进行一些额外的调整以使其成为正确的 HTML。 也就是说,我会像我那样搜索和替换通常的 XML 元字符,例如在我对SO: qt plaintextedit change message color 的回答中。

【讨论】:

以上是关于如何在不使用当前段落样式的情况下附加到 QTextEdit的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 PHP 加载整个内容的情况下附加到大型 XML(文件)

如何在不删除跨度的情况下更改 html 段落内容?

如何在不跟踪索引的情况下将元素附加到列表?

如何在不删除旧文档的情况下将 XMLDocument 附加到 LocalStorage

如何在不导致复制的情况下将 char 数据附加到 std::vector

如何在不将 onscroll 处理程序附加到每个容器的情况下捕获页面上的所有滚动事件