如何在不使用当前段落样式的情况下附加到 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 元字符,例如在我对 .
的回答中
使用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 元字符,例如在我对