Russian Qt Forum
Ноябрь 27, 2024, 11:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextDocument кушает пробелы  (Прочитано 6251 раз)
Eol
Гость
« : Июнь 08, 2010, 14:32 »

Здравствуйте, уважаемые!
Есть простенький код на Qt/C++:
Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QtGui/QTextDocument>
#include <QtCore/QByteArray>
#include <QtCore/QDebug>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   QTextDocument *doc = new QTextDocument();
 
   qDebug() << " === Document was: === ";
   qDebug() << doc->toHtml("utf-8");
   doc->setHtml("<p>THIS       IS      TEST</p>");
 
   qDebug() << " === Document now: === ";
   qDebug() << doc->toHtml("utf-8");
 
   return a.exec();
}
 

Он выводит вот что:
Цитировать
=== Document was: === 
"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Helvetica'; font-size:12pt; font-weight:400; font-style:normal;">
<table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
<tr>
<td style="border: none;">
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html>"
 === Document now: === 
"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Helvetica'; font-size:12pt; font-weight:400; font-style:normal;">
<table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
<tr>
<td style="border: none;">
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">THIS IS TEST</p></td></tr></table></body></html>"

Во-первых, из HTML пустого (да и не пустого) QTextDocument'а следует, что в нем есть что-то вроде стандартной CSS'ки - она ставит опции "white-space: pre-wrap" тэгам <p> и <li> документа. Это значит, что текст в этих тэгах форматирован (конкретней, пробелы) и не стоит их убивать. Однако, когда мы добавляем текст с <p> тэгом и текстом с кучей пробелов - оно их убивает.
Вопрос №1 - почему?
Вопрос №2 - откуда берутся margin'ы в этом случае? (12px, bottom и top)
Далее, если мы вызываем doc->setDefaultStyleSheet("p, li { white-space: pre-wrap; }"), то при добавлении оно НЕ убивает пробелы; однако, если при этом мы делаем doc->setHtml("THIS        IS         TEST"), то оно само добавляет <p> тэги, и, не смотря на установленную CSS, убивает пробелы.
Вопрос №3 аналогичен вопросу №1 - почему?
Вот такая вот проблема.
Параллельно задал вопрос на qtcentre.org (там ответили, но не совсем в тему), qtforum.org (там пока молчат), stackoverflow.com (молчат) и askdev.ru (молчат). Задаю и тут, и надеюсь на вашу помощь Улыбающийся
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Июнь 08, 2010, 16:36 »

А в html пробелы разве не &nbsp; ставятся? Попробуй в любом редактор html забить текст с пробелами и посмотри в код - увидишь.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Eol
Гость
« Ответ #2 : Июнь 08, 2010, 16:52 »

А в html пробелы разве не &nbsp; ставятся? Попробуй в любом редактор html забить текст с пробелами и посмотри в код - увидишь.
обычно - да. Тут же есть CSS, в которой написано - white-space: pre-wrap, из-за чего как раз пробелы не будут (и не должны) игнорироваться. А насчет html-редактора, то код
Цитировать
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Helvetica'; font-size:12pt; font-weight:400; font-style:normal;">
<table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
<tr>
<td style="border: none;">
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">THIS        IS        TEST</p></td></tr></table></body></html>
(куча пробелов) как раз отображается нормально, как и должен, с кучей пробелов
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Июнь 08, 2010, 16:59 »

doc->setHtml будет генерировать весь код заново, поэтому пробелов не дождешься скорее всего Улыбающийся
Попробуй в setHtml засунь код с white-space: pre-wrap.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Eol
Гость
« Ответ #4 : Июнь 08, 2010, 17:35 »

Но, блин, генерирует-же он его все равно с этой CSS'кой, а сам ее потом игнорирует Грустный
Если такой код - doc->setHtml("<style type=\"text/css\">p,li{white-space:pre-wrap;}</style><p>THIS       IS       TEST</p>");
то он тоже рабоатет нормально. Ключевой вопрос - почему он игнорирует свою дефолтную CSS'ку? И что делать, если у меня текст без <p> тэга - добавлять его, что-ли? (просто сам QTextDocument еще его добавляет).
И, опять-же, откуда margin'ы?
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #5 : Июнь 08, 2010, 18:09 »

Может он сначала пробелы урезает, а потом генерирует код Улыбающийся
Если сильно интересно, покопайся в исходниках..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Eol
Гость
« Ответ #6 : Июнь 08, 2010, 21:28 »

Может он сначала пробелы урезает, а потом генерирует код Улыбающийся
Если сильно интересно, покопайся в исходниках..
Ну, тогда бы убивал пробелы если мы добавляем строку setHtml("<style type=\"text/css\">p,li{white-space:pre-wrap;}</style><p>THIS     IS     TEST</p>") - похоже, все не так просто. Ключевой вопрос - это баг или фича Qt?
Да, и все-же, откуда margin'ы? Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.081 секунд. Запросов: 23.