2009-02-11 58 views
1

我在QT QLabel中呈现一些HTML。该HTML看起来像这样:使用Qt的QLabel类更改呈现的HTML中的制表符大小

<pre>foo\tbar</pre> 

(请注意,我已经把“\ t”的地方有代码中的一个选项卡chracter)。

这呈现很好,但制表符似乎呈现为八个空格,而我希望它被重新排列为4.如何更改此而无需更改源HTML

回答

6

根据W3(HTML4):(在[ISO10646]十进制9和[ISO88591])

水平制表符通过视觉用户代理通常被解释为最小的非零数的必要空间沿着每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

在<PRE>,标签应被理解为水平列位置转移到下一个位置,这在同一行上是8的倍数;也就是说,列:=(COL + 8)模8

+0

是的,我意识到我可以编辑源代码并用空格字符替换制表符,但我在问题中明确提到我真的不想开始编辑源HTML。 此外,你的解析器伪代码可以写在python中更容易: code.replace('\ t','') – Thomi 2009-02-14 09:29:35

1

试试这个:

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

可以工作

+0

这是行不通的(与Qt 5.5.1)。另外,`tab-interval`无效。 `tab-size`在未来可能会有用(但它也不起作用)。 – equaeghe 2016-03-08 22:40:02

2

虽然QLabel使用QTextDocument内部再现丰富的文本时,它不允许在其API中访问它。然而,由于QTextDocumentQObject,你可以尝试使用

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

来访问它(如果QLabel创建QTextDocument作为自身的(直接或间接)的孩子会工作)。

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

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

这就是说,我就是这样解决问题的。

+0

不幸的是,QTextdocument实例不在QObject父子树中(并且由于QLabel没有受保护的ctor接受d-ptr,因此通过d-ptr技巧进行访问也是不可能的),所以看起来就像是最简陋的方式可能会回落到QTextBrowser,或smth ... – mlvljr 2015-03-09 21:20:47