Название: QTextDocument кушает пробелы Отправлено: Eol от Июнь 08, 2010, 14:32 Здравствуйте, уважаемые!
Есть простенький код на Qt/C++: Код
Он выводит вот что: Цитировать === 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 пробелы разве не ставятся? Попробуй в любом редактор html забить текст с пробелами и посмотри в код - увидишь.
Название: Re: QTextDocument кушает пробелы Отправлено: Eol от Июнь 08, 2010, 16:52 А в html пробелы разве не ставятся? Попробуй в любом редактор 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'ы? :) |