1

我在 QT QLabel 中呈现一些 HTML。HTML 如下所示:

<pre>foo\tbar</pre>

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

这渲染得很好,但是制表符似乎被渲染为八个空格,而我希望它被重新渲染为 4。如何在不更改源 HTML 的情况下更改它

4

3 回答 3

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 指定使用八字符制表符

在 <PRE> 中,tab 应该被解释为将水平列位置移动到下一个位置,该位置是同一行上 8 的倍数;也就是说,col := (col+8) mod 8。

于 2009-02-11T20:00:49.307 回答
2

虽然在呈现富文本时在内部QLabel使用 a QTextDocument,但它不允许在其 API 中访问它。但是,由于QTextDocument是 a QObject,您可以尝试使用

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

访问它(如果QLabel创建QTextDocument作为自身的(直接或间接)子级将起作用)。

一旦有了指向文本文档的指针,就可以使用QTextDocumentAPI,例如QTextOption::setTabsStop(),更改制表位。

最后一步是以某种方式使QLabel重绘本身。可能调用QWidget::update()就足够了,但缓存(或更糟糕的是,重新创建文本文档)可能会阻止这一点。在这种情况下,您可以在标签上注册一个事件侦听器,以在 a 之前调整文本文档paintEvent(),但请注意,sizeHint()当制表符停止更改时,它也可能会更改,因此可能会更复杂。

也就是说,这就是我解决问题的方式。

于 2009-08-05T19:39:32.397 回答
1

试试这个:

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

可以工作

于 2009-02-11T20:55:08.457 回答