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

问题描述

我从 HTML 文件中读取了 QTextDocument;给定 QString 的名为 topicFileData 的 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 的所有跨度,获取当前跨度的字符格式,从格式中删除颜色属性,并将修改后的格式设置回跨度。那没问题;但我不知道如何以这种方式循环跨度。感谢您的帮助。

解决方法

不是创建一个新的 QTextCharFormat 实例,而是更新当前格式并在 QTextEdit 上重新应用它;

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

我发现的一个次优解决方案是在创建 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 文档的正文文本碰巧包含与正则表达式匹配的文本,正则表达式会修改它,从而破坏文档的内容。所以我不推荐这个解决方案,我也不会接受它。如果有人可以提供更好的解决方案,那就更好了。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...