Здравствуйте, уважаемые!
Есть простенький код на 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 (молчат). Задаю и тут, и надеюсь на вашу помощь