0

QTextDocument从 HTML 文件中读取;给定一个QString名为的 HTML 数据topicFileData,我愿意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一个一个地遍历所有 span,获取当前 span 的 char 格式,从格式中删除颜色属性,并将修改后的格式设置回 span。那很好;但我不知道如何以这种方式循环跨度。谢谢你的帮助。

4

2 回答 2

1

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

default = QTextCharFormat()
charFormat = self.textCursor().charFormat()
charFormat.setBackground(default.background())
charFormat.setForeground(default.foreground())
self.textCursor().mergeCharFormat(charFormat)
于 2021-05-04T11:44:05.103 回答
0

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

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

于 2021-01-18T17:49:29.830 回答