Изменить размер табуляции в отображаемом HTML с помощью класса Qt QLabel - PullRequest
1 голос
/ 11 февраля 2009

Я рендеринг некоторого HTML в QT QLabel. HTML выглядит так:

<code><pre>foo\tbar

(обратите внимание, что я поставил "\ t" там, где в коде есть символ табуляции).

Это хорошо выглядит, но символ табуляции представляется как восемь пробелов, тогда как я хочу, чтобы он отображался как 4. Как я могу изменить это без необходимости изменения исходного HTML ?

Ответы [ 3 ]

6 голосов
/ 11 февраля 2009

Согласно W3 (HTML4):

Горизонтальный символ табуляции (десятичный 9 в [ISO10646] и [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 определяет использование восьмисимвольных вкладок :

В пределах

вкладка должна интерпретироваться как сдвиг горизонтальной позиции столбца к следующей позиции, кратной 8 на той же строке; то есть col: = (col + 8) mod 8. 
2 голосов
/ 05 августа 2009

В то время как QLabel использует QTextDocument внутренне при рендеринге расширенного текста, он не разрешает доступ к нему в своем API. Однако, поскольку QTextDocument является QObject, вы можете попробовать использовать

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

для получения доступа к нему (будет работать, если QLabel создаст QTextDocument как (прямой или косвенный) дочерний элемент для себя).

Если у вас есть указатель на текстовый документ, вы можете использовать QTextDocument API, например, QTextOption::setTabsStop(), чтобы изменить табуляции.

Последний шаг - каким-то образом заставить QLabel перекрасить себя. Вероятно, достаточно вызова QWidget::update(), но кеширование (или, что еще хуже, воссоздание текстового документа) может помешать этому. В этом случае вы можете зарегистрировать прослушиватель событий на метке, чтобы настроить текстовый документ непосредственно перед paintEvent(), но учтите, что sizeHint() может также измениться при изменении позиции табуляции, поэтому он может быть еще более сложным.

Тем не менее, это то, как я подхожу к проблеме.

1 голос
/ 11 февраля 2009

Попробуйте это:

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

Может работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...