如何从 QTextDocument 中删除所有文本颜色属性?

How to remove all text color attributes from a QTextDocument?

我从 HTML 文件中读取了 QTextDocument;给定一个名为 topicFileDataQString of HTML 数据,我做 topicFileTextDocument.setHtml(topicFileData);。然后我想去掉所有的颜色信息,使整个文档只使用默认的前景和背景画笔。 (我不想 明确地将文本设置为白底黑字;我想删除 文档中的颜色信息。 ) (背景信息:我需要这样做的原因是文档中的一些跨度被错误地设置为黑色前景色,而不仅仅是没有设置颜色信息,并且当我的应用程序处于“暗模式”运行 时,当 Qt 将默认文本背景画笔更改为黑色而不是白色时,这会导致这些跨度显示为黑底黑字。)

这是我尝试过的:

QTextCursor tc(&topicFileTextDocument);
tc.select(QTextCursor::Document);
QTextCharFormat noColorFormat;
noColorFormat.clearForeground();
noColorFormat.clearBackground();
tc.mergeCharFormat(noColorFormat);

不幸的是,这不起作用;看起来 mergeCharFormat() 不明白我想要合并 clearForeground()clearBackground() 操作以剥离这些属性。

当然,我可以改为tc.setCharFormat(noColorFormat);,这样可以正确去除颜色属性;但它也抹去了所有其他字符格式信息(字体等),这是不可接受的。

所以,理想情况下,我想找到一个 API,它可以让我从 QTextDocument 中明确删除给定的文本属性。或者,我想我需要一个一个地遍历 QTextDocument 的所有跨度,获取当前跨度的字符格式,从格式中删除颜色属性,然后将修改后的格式设置回跨度。那样就好了;但我不知道如何以这种方式遍历跨度。感谢您的帮助。

我发现的一个次优解决方案是在创建 QTextDocument 之前使用正则表达式实际编辑 HTML 数据字符串:

topicFileData.replace(QRegularExpression("(;? ?color: ?#[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f])"), "");

这适用于我的情况,因为我的 HTML 文件中的所有颜色都设置了 color: #XXXXXX 样式属性,这些属性可以从 HTML 本身中删除。然而,这是脆弱的;以其他方式指定的颜色不会被去除,如果 HTML 文档的正文恰好包含与正则表达式匹配的文本,正则表达式将修改它并因此破坏文档的内容。所以我不推荐这个解决方案,我也不会接受它。如果有人能提供更好的解决方案,那将是更可取的。

不是创建 QTextCharFormat 的新实例,而是更新当前格式并将其重新应用到 QTextEdit 上;

default = QTextCharFormat()
charFormat = self.textCursor().charFormat()
charFormat.setBackground(default.background())
charFormat.setForeground(default.foreground())
self.textCursor().mergeCharFormat(charFormat)