我在QT QLabel中渲染了一些HTML。 HTML看起来像这样:
<pre>foo\tbar</pre>
(请注意,我已将“\ t”放在代码中有标签字符的位置)。
这呈现得很好,但是标签字符似乎呈现为八个空格,而我希望它被重新标记为4.如何更改此而无需更改源HTML ?< / p>
答案 0 :(得分:6)
根据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会指定使用eight-character tabs:
在&lt; PRE&gt;内,标签应解释为将水平列位置移动到下一个位置,该位置是同一行上的8的倍数;也就是说,col:=(col + 8)mod 8。
答案 1 :(得分:2)
虽然QLabel
在呈现富文本时在内部使用QTextDocument
,但它不允许在其API中访问它。但是,由于QTextDocument
是QObject
,您可以尝试使用
QTextDocument * tl = label->findChild<QTextDocument>();
可以访问它(如果QLabel
将QTextDocument
创建为(直接或间接)自己的孩子,则会有效。
获得指向文本文档的指针后,您可以使用QTextDocument
API,例如QTextOption::setTabsStop()
,更改制表位。
最后一步是以某种方式使QLabel
重绘自己。可能对QWidget::update()
的调用就足够了,但是缓存(或者更糟糕的是,重新创建文本文档)可能会对此产生影响。在这种情况下,您可以在标签上注册事件监听器,以便在paintEvent()
之前调整文本文档,但请注意,当标签停止更改时,sizeHint()
也可能会发生变化,因此它可能是更复杂的。
那就是说,这就是我解决问题的方法。
答案 2 :(得分:1)
试试这个:
<pre style="tab-interval:0.5in">foo\tbar</pre>
可以工作