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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextCursor::insertHtml ломает документ  (Прочитано 3156 раз)
NortT
Гость
« : Июнь 05, 2011, 13:55 »

В общем такая проблема, есть кусок html-кода, который хранится в переменной QString tmpDoc:
Код
HTML
"<ol><li>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">String 1</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">String 2</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">String 3</p></li><li>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">String 4</p></li><li>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">String 5</p></li></ol>"
Далее хочу вставить этот кусок в QTextDocument  с помощью курсора. Делаю это таким образом:
Код
C++ (Qt)
cursor.insertHtml(QObject::tr("<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Question #") +
 QVariant(1).toString()+ "</p>" +
 tmpDoc + "<p></p>");
И в итоге я получаю вот такой html-код:
Код
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" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Question #1</p>
<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">String 1</li>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">String 2</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">String 3</p>
<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">String 4</li>
<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">String 5</li></ol>
<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></body></html>
Как видим, абзацы "String 2" и "String 3" раньше были внутри <li>, а после вставки стали болтаться сами по себе. Что тут сделать можно?
P.S.
Код
C++ (Qt)
QTextDocument textDoc;
textDoc.setHtml(tmpDoc);
Также изменяет положение абзацев
« Последнее редактирование: Июнь 05, 2011, 16:20 от NortT » Записан
NortT
Гость
« Ответ #1 : Июнь 06, 2011, 16:39 »

Ну хорошо, переформулирую вопрос по другому Улыбающийся
Как с помощью cursor.insertHtml вставить в блок <li></li> абзац <p></p>? Дело в том, что при вставке тэг абзаца удаляется и блок <li> закрывается, вернее закрывается даже не <li>, а <ol>. И получается, что если мне под нумерацию нужно засунуть несколько подряд идущих абзацев (например, <p></p><p></p>), то под тэгом <li> окажется только первый из них, второй абзац будет вне этого тэга.

P.S. Знатоки QTextDocument отзовитесь!!!11 Улыбающийся
Записан
vincent
Гость
« Ответ #2 : Июнь 06, 2011, 18:37 »

Вот тут кажется ваша ситуация, вроде как... Улыбающийся
Записан
NortT
Гость
« Ответ #3 : Июнь 07, 2011, 12:08 »

Да похоже на то...
Короче всячески я тут по извращался, с помощью регулярных выражений навыдергивал содержимое абзацев из документа и вставил таки это все в список. Получилось примерно вот так:
Код
C++ (Qt)
   textDoc->clear();
   cursor.insertList(QTextListFormat::ListDecimal);
   for (int i=0; i<question.getListAnswer().count(); i++)
   {
       QStringList text = question.getListAnswer().getAnswer(i).getTextAnswer().split(QRegExp("</{0,1}p[^>]*>"),
                                                                                          QString::SkipEmptyParts);
       if (!text.empty())
       {
           for (int i=1; i<text.count()-1; i++)
           {
               cursor.insertHtml(text[i]+"<br>");
           }
           if (i != question.getListAnswer().count()-1) cursor.insertBlock(); //&#1095;&#1090;&#1086;&#1073;&#1099; &#1085;&#1077; &#1074;&#1089;&#1090;&#1072;&#1074;&#1083;&#1103;&#1090;&#1100; &#1083;&#1080;&#1096;&#1085;&#1080;&#1081; &#1073;&#1083;&#1086;&#1082; &#1074; &#1082;&#1086;&#1085;&#1094;&#1077;
       }
   }
В принципе все неплохо, но вот тэг <br> почему то дублируется в html-исходнике:
Код
HTML
<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">&#1054;&#1090;&#1074;&#1077;&#1090; &#8470;1, &#1089;&#1090;&#1088;&#1086;&#1082;&#1072; &#8470;1<br /><br />&#1054;&#1090;&#1074;&#1077;&#1090; &#8470;1, &#1089;&#1090;&#1088;&#1086;&#1082;&#1072; &#8470;2<br /><br />&#1054;&#1090;&#1074;&#1077;&#1090; &#8470;1, &#1089;&#1090;&#1088;&#1086;&#1082;&#1072; &#8470;3<br /></li>
Как бы теперь еще это побороть для полного счастья? Улыбающийся
« Последнее редактирование: Июнь 07, 2011, 16:40 от NortT » Записан
NortT
Гость
« Ответ #4 : Июнь 07, 2011, 16:46 »

А все, разобрался, регулярка кривоватая чуть-чуть оказалась Улыбающийся
Всем спасибо за участие Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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