Название: QTextCursor::insertHtml ломает документ
Отправлено: 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);
Также изменяет положение абзацев
Название: Re: QTextCursor::insertHtml ломает документ
Отправлено: NortT от Июнь 06, 2011, 16:39
Ну хорошо, переформулирую вопрос по другому :) Как с помощью cursor.insertHtml вставить в блок <li></li> абзац <p></p>? Дело в том, что при вставке тэг абзаца удаляется и блок <li> закрывается, вернее закрывается даже не <li>, а <ol>. И получается, что если мне под нумерацию нужно засунуть несколько подряд идущих абзацев (например, <p></p><p></p>), то под тэгом <li> окажется только первый из них, второй абзац будет вне этого тэга.
P.S. Знатоки QTextDocument отзовитесь!!!11 :)
Название: Re: QTextCursor::insertHtml ломает документ
Отправлено: vincent от Июнь 06, 2011, 18:37
Вот тут (http://bugreports.qt.nokia.com/browse/QTBUG-10416) кажется ваша ситуация, вроде как... :)
Название: Re: QTextCursor::insertHtml ломает документ
Отправлено: NortT от Июнь 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(); //чтобы не вставлять лишний блок в конце } }
В принципе все неплохо, но вот тэг <br> почему то дублируется в html-исходнике: HTML <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ответ №1, строка №1<br /><br />Ответ №1, строка №2<br /><br />Ответ №1, строка №3<br /></li>
Как бы теперь еще это побороть для полного счастья? :)
Название: Re: QTextCursor::insertHtml ломает документ
Отправлено: NortT от Июнь 07, 2011, 16:46
А все, разобрался, регулярка кривоватая чуть-чуть оказалась :) Всем спасибо за участие :)
|