我在 QT QLabel 中呈现一些 HTML。HTML 如下所示:
<pre>foo\tbar</pre>
(请注意,我已将“\t”放在代码中有制表符的位置)。
这渲染得很好,但是制表符似乎被渲染为八个空格,而我希望它被重新渲染为 4。如何在不更改源 HTML 的情况下更改它?
根据W3 (HTML4):
水平制表符([ISO10646] 和 [ISO88591] 中的十进制 9)通常被视觉用户代理解释为沿每 8 个字符的制表位排列字符所需的最小非零空格数。我们强烈反对在预格式化文本中使用水平制表符,因为在编辑时将制表符间距设置为其他值是常见的做法,这会导致文档未对齐。
它本质上是实现定义的。大多数(如果不是全部)浏览器/渲染器使用八个空格作为制表符。这不能在 Qt 中配置。
然而,浏览您的 HTML 并用您希望的任意数量的空格替换选项卡有点微不足道。为此编写一个简单的解析器。伪代码:
for each <pre> block {
for each line in block {
position_in_line = 0
for each character in line {
if character is a tab {
remove tab character
do {
add a space character
++position_in_line
} while position_in_line % 8 != 0
} else {
++position_in_line
}
}
}
}
如果您好奇,HTML3 指定使用八字符制表符:
在 <PRE> 中,tab 应该被解释为将水平列位置移动到下一个位置,该位置是同一行上 8 的倍数;也就是说,col := (col+8) mod 8。
虽然在呈现富文本时在内部QLabel
使用 a QTextDocument
,但它不允许在其 API 中访问它。但是,由于QTextDocument
是 a QObject
,您可以尝试使用
QTextDocument * tl = label->findChild<QTextDocument>();
访问它(如果QLabel
创建QTextDocument
作为自身的(直接或间接)子级将起作用)。
一旦有了指向文本文档的指针,就可以使用QTextDocument
API,例如QTextOption::setTabsStop()
,更改制表位。
最后一步是以某种方式使QLabel
重绘本身。可能调用QWidget::update()
就足够了,但缓存(或更糟糕的是,重新创建文本文档)可能会阻止这一点。在这种情况下,您可以在标签上注册一个事件侦听器,以在 a 之前调整文本文档paintEvent()
,但请注意,sizeHint()
当制表符停止更改时,它也可能会更改,因此可能会更复杂。
也就是说,这就是我解决问题的方式。
试试这个:
<pre style="tab-interval:0.5in">foo\tbar</pre>
可以工作