Russian Qt Forum

Qt => Общие вопросы => Тема начата: Eol от Июнь 08, 2010, 14:32



Название: QTextDocument кушает пробелы
Отправлено: 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 (молчат). Задаю и тут, и надеюсь на вашу помощь :)


Название: Re: QTextDocument кушает пробелы
Отправлено: kibsoft от Июнь 08, 2010, 16:36
А в html пробелы разве не &nbsp; ставятся? Попробуй в любом редактор html забить текст с пробелами и посмотри в код - увидишь.


Название: Re: QTextDocument кушает пробелы
Отправлено: Eol от Июнь 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>
(куча пробелов) как раз отображается нормально, как и должен, с кучей пробелов


Название: Re: QTextDocument кушает пробелы
Отправлено: kibsoft от Июнь 08, 2010, 16:59
doc->setHtml будет генерировать весь код заново, поэтому пробелов не дождешься скорее всего :)
Попробуй в setHtml засунь код с white-space: pre-wrap.


Название: Re: QTextDocument кушает пробелы
Отправлено: Eol от Июнь 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'ы?


Название: Re: QTextDocument кушает пробелы
Отправлено: kibsoft от Июнь 08, 2010, 18:09
Может он сначала пробелы урезает, а потом генерирует код :)
Если сильно интересно, покопайся в исходниках..


Название: Re: QTextDocument кушает пробелы
Отправлено: Eol от Июнь 08, 2010, 21:28
Может он сначала пробелы урезает, а потом генерирует код :)
Если сильно интересно, покопайся в исходниках..
Ну, тогда бы убивал пробелы если мы добавляем строку setHtml("<style type=\"text/css\">p,li{white-space:pre-wrap;}</style><p>THIS     IS     TEST</p>") - похоже, все не так просто. Ключевой вопрос - это баг или фича Qt?
Да, и все-же, откуда margin'ы? :)