使用Qt的QLabel类在呈现的HTML中更改制表位大小

时间:2009-02-11 19:51:13

标签: c++ html qt rendering

我在QT QLabel中渲染了一些HTML。 HTML看起来像这样:

<pre>foo\tbar</pre>

(请注意,我已将“\ t”放在代码中有标签字符的位置)。

这呈现得很好,但是标签字符似乎呈现为八个空格,而我希望它被重新标记为4.如何更改此而无需更改源HTML ?< / p>

3 个答案:

答案 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中访问它。但是,由于QTextDocumentQObject,您可以尝试使用

QTextDocument * tl = label->findChild<QTextDocument>();

可以访问它(如果QLabelQTextDocument创建为(直接或间接)自己的孩子,则会有效。

获得指向文本文档的指针后,您可以使用QTextDocument API,例如QTextOption::setTabsStop(),更改制表位。

最后一步是以某种方式使QLabel重绘自己。可能对QWidget::update()的调用就足够了,但是缓存(或者更糟糕的是,重新创建文本文档)可能会对此产生影响。在这种情况下,您可以在标签上注册事件监听器,以便在paintEvent()之前调整文本文档,但请注意,当标签停止更改时,sizeHint()也可能会发生变化,因此它可能是更复杂的。

那就是说,这就是我解决问题的方法。

答案 2 :(得分:1)

试试这个:

<pre style="tab-interval:0.5in">foo\tbar</pre>

可以工作