How to change font weight at various locations within a QTextEdit
-
Hi,
Everything is in the title.
I have a text in a QTextEdit.
I would like, for example, to highlight titles with a bigger font.
Many thanks. -
Hi
The text is blocks/paragraphs and you use
QTextCursor and QTextBlockFormat to format it.http://stackoverflow.com/questions/27716625/qtextedit-change-font-of-individual-paragraph-block
-
Thank you I'll take a look
-
Is it the only way ? I find it a little bit tricky, just to write a line (title) with a bigger font weight ...
-
@mulfycrowh
well for a title you can also insert HTML
http://doc.qt.io/qt-5/qtextedit.html#html-propTo "cheat" u can use the html editor ( right click the textedit in Designer)
and get the complete syntax and simply do some +text+ operation to set your title. -
What do you think about the following thread :
http://www.qtcentre.org/threads/24331-How-to-set-text-and-font-in-qTextEdit
-
well it shows a slightly smarter way to use html and
a cursor. so yes could also be used even u are then very close to the normal textformat way. -
Here is what I wrote:
// convert a number into a QString made of 2 characters QString Tools::toHexString(int value) { QString sHex = QString::number(value, 16).toUpper(); if (sHex.length() == 1) sHex.prepend('0'); return sHex; } // highlight the text in QTextEdit edit at location for charcount characters // (red, green, blue) is the color // fontsize is the size of the font // string may be highlighted with bold and underlined styles void Tools::toHtml(QTextEdit* edit, int location, int charcount, int red, int green, int blue, int fontsize, bool bold, bool underlined) { QTextCursor cursor(edit->document()); QString highlight; QString sfont_beg = "<FONT "; QString sfont_end = "</FONT>"; QString scolor = "color=#" + toHexString(red) + toHexString(green) + toHexString(blue) + " "; QString sbold = "span style=font-weight:bold "; QString sunderlined = "span style=text-decoration:underline "; QString ssize = "size=" + QString::number(fontsize) + ">"; QString sHtml; cursor.setPosition(location, QTextCursor::MoveAnchor); cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, charcount); highlight = cursor.selectedText(); sHtml = sfont_beg + scolor.toUpper(); if (bold) sHtml = sHtml.append(sbold); if (underlined) sHtml = sHtml.append(sunderlined); sHtml = sHtml + ssize + highlight + sfont_end; cursor.insertHtml(sHtml); }
It runs pretty well.
The trouble comes when I add several times (title + text) to the QTextEdit.
Each title has a length of 26 characters.
The length of each text is different.
I computed the location for each title as follows:0 for the first one
26 + text0.length()
26 + text0.length() + 26 + text1.length()
...If I apply this algorithm when I have appended all the texts to the QTextEdit, the fist title is well highlighted but there is a shift for the following ones.
I don't understand why. -
hi
nothing pop out in the code but i wonder if all (test) Titles are same color.
as you say
if (sHex.length() == 1)
sHex.prepend('0');so maybe other color can alter the 26 offset ?
-
Yep. All titles are the same color.
Here is the code to highlight the titles:for (int Index = 0; Index < m_process.size(); ++Index) m_tools->toHtml(ui.Command_Edit, referenceLocation[Index], 17 + msg_description.length(), 0, 133, 255, 25, false, false);
But the trouble is that I encounter a shift about the highlighting. The first title is OK (obviously because 0), the following highlightings are false, I mean the location.
I don't see any problem. -
I think I found the trouble : we have to substract the count of CR (or LF).
But I have to add 2, I don't understand why. It would mean that there are 2 extra characters that are not text.
So, for the algorithm of computing the location (vector referenceLocation - first element equals to 0), if I write:if (Index != 0) { referenceLocation.append(referenceLocation[Index - 1]); referenceLocation[Index] += m_command->getCommandFileContent(UNCOMPRESSED, UNCODED).size(); referenceLocation[Index] += 17 + msg_description.length(); referenceLocation[Index] -= m_command->getCommandFileContent(UNCOMPRESSED, UNCODED).count('\n'); referenceLocation[Index] += 2;
information : title is made of 17 characters and description,
it runs perfectly !
-
good found.
well a newline is \n\r on windows.
so maybe thats why with 2. -
Hi folks !
I open this topic again because I get a weird thing.
Here is what I wrote:void Tools::toHtml(QPlainTextEdit* edit, int location, int charcount, int red, int green, int blue, int fontsize, bool bold, bool underlined) { QTextCursor cursor(edit->document()); QString highlight; QString sfont_beg = "<FONT "; QString sfont_end = "</FONT>"; QString scolor = "color=#" + toHexString(red) + toHexString(green) + toHexString(blue) + " "; QString sbold = "span style=font-weight:bold "; QString sunderlined = "span style=text-decoration:underline "; QString ssize = "size=" + QString::number(fontsize) + ">"; QString sHtml; cursor.setPosition(location, QTextCursor::MoveAnchor); cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, charcount); highlight = cursor.selectedText(); sHtml = sfont_beg + scolor.toUpper(); if (bold) sHtml = sHtml.append(sbold); if (underlined) sHtml = sHtml.append(sunderlined); sHtml = sHtml + ssize + highlight + sfont_end; cursor.insertHtml(sHtml); }
I call the function here:
m_tools->toHtml(m_descriptionPlainTextEdit, 0, 17 + msg_description.length(), 0, 133, 255, 25, false, false);
The title that has to be highlighted in blue has a length equal to 17 + msg_description.length().
Everything perfectly runs the first time, not the following ones : all the text in the text edit is highlighted in blue.
I don't see any trouble.PS: the text edit is cleared each time.
Many thanks for help !
-
Hi
ïf you put edit->clear();
in top, it really should do the same each time. -
@mulfycrowh
Well you said
"PS: the text edit is cleared each time."
So I assumed you meant pr call to the function.If all becomes blue it sounds like all is one paragraph.
You might need to use <p > </p> if the end result is something like
-
- But why everything OK the first time and all the text blue with big size font the other ones ?
I have not check output of the code but I assume it becomes
one big paragraph and therefore it is all blue.But only way to tell is to see the generated HTML. step by step.
-
I added the following lines to toHtml ant it runs !
cursor.setPosition(charcount, QTextCursor::MoveAnchor); cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, edit->document()->characterCount()); highlight = cursor.selectedText(); sHtml = "<FONT face=\"Arial\" font-weight=\"normal\" COLOR=#000000 size=\"3\">" + highlight + "</FONT>"; cursor.insertHtml(sHtml);
-
Nevertheless, I do not understand size=3 because, in the constructor I wrote:
font.setPointSize(10);
Why 3 instead 10 ?
3 gives the same size.