В одном из моих проектов я создал QTextDocument, которому принадлежит текст, который мне нужно нарисовать. Текст представляет собой слово, завернутое в HTML форматированный текст, и его следует рисовать в прямоугольной области, для которой я знаю ширину. Его содержание также никогда не будет превышать абзаца.
Текстовый документ создается следующим образом:
// create and configure the text document to measure
QTextDocument textDoc;
textDoc.setHtml(text);
textDoc.setDocumentMargin(m_TextMargin);
textDoc.setDefaultFont(m_Font);
textDoc.setDefaultTextOption(m_TextOption);
textDoc.setTextWidth(m_Background.GetMessageWidth(size().width()));
, и вот пример текста, который я хочу нарисовать:
Ceci est un texte <img src=\"Resources/1f601.svg\" width=\"24\" height=\"24\"> avec <img src=\"Resources/1f970.svg\" width=\"24\" height=\"24\"> une <img src=\"Resources/1f914.svg\" width=\"24\" height=\"24\"> dizaine <img src=\"Resources/1f469-1f3fe.svg\" width=\"24\" height=\"24\"> de <img src=\"Resources/1f3a8.svg\" width=\"24\" height=\"24\"> mots. Pour voir comment la vue réagit.
Изображения являются изображениями SVG, полученными из ресурсов qml.
Чтобы выполнить несколько операций во время рисования текста, мне нужно знать, сколько линий будет нарисовано после применения переноса слов, и высота любой строки в завернутом в слово тексте.
Я попытался выполнить поиск в функциях, предоставляемых текстовым документом, а также в функциях, предоставленных в QTextBLock, QTextFragment и QTextCursor. Я пробовал несколько подходов, таких как перебирать символы с помощью курсора и подсчитывать строки или подсчитывать каждый фрагмент в блоке. К сожалению, ни одна из них не сработала: все функции всегда подсчитывают 1 строку или просто терпят неудачу.
Вот пример кода, который я уже попробовал, но безуспешно:
// FAILS - always return 1
int lineCount = textDoc.lineCount()
// FAILS - always return 1
int lineCount = textDoc.blockCount()
// FAILS - return the whole text height, not a particular line height at index
int lineHeight = int(textDoc.documentLayout()->blockBoundingRect(textDoc.findBlockByNumber(lineNb)).height());
// get the paragraph (there is only 1 paragraph in the item text document
QTextBlock textBlock = textDoc.findBlockByLineNumber(lineNb);
int blockCount = 0;
for (QTextBlock::iterator it = textBlock.begin(); it != textBlock.end(); ++it)
{
// FAILS - fragments aren't divided by line, e.g an image will generate a fragment
QString blockText = it.fragment().text();
++blockCount;
}
return blockCount;
QTextCursor cursor(&textDoc);
int lineCount = 0;
cursor.movePosition(QTextCursor::Start);
// FAILS - movePosition() always return false
while (cursor.movePosition(QTextCursor::Down))
++lineCount;
Я не могу понять, что я делаю неправильно, и почему все мои подходы терпят неудачу.
Итак, мои вопросы:
- Как я могу сосчитать строки, содержащиеся в моем завернутый в слово документ
- Как измерить высоту строки в моем завернутом слове документ
- Не работает ли функция текстового документа из-за html формат? Если да, как мне поступить, чтобы достичь своих целей в таком контексте?
ПРИМЕЧАНИЕ Я знаю, как измерить всю высоту текста. Однако, поскольку высота каждой строки может быть разной, я не могу просто разделить всю высоту текста на строки, поэтому для меня это неприемлемое решение.