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