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.


  • Qt Champions 2016

    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 ...


  • Qt Champions 2016

    @mulfycrowh
    well for a title you can also insert HTML
    http://doc.qt.io/qt-5/qtextedit.html#html-prop

    To "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.




  • Qt Champions 2016

    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.


  • Qt Champions 2016

    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 !


  • Qt Champions 2016

    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 !


  • Qt Champions 2016

    Hi
    ïf you put edit->clear();
    in top, it really should do the same each time.



  • @mrjj Hi ! What do you mean in top ? In toHtml ? It would delete all the content.


  • Qt Champions 2016

    @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



  • @mrjj The idea sounds interesting. I'll test it.
    But why everything OK the first time and all the text blue with big size font the other ones ?
    It acts as the QTextEdit keeps backup of something.
    Thanks again !


  • Qt Champions 2016

    @mulfycrowh

    • 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.


  • Qt Champions 2016

    @mulfycrowh
    Not sure what unit "size" is in. Could be an index to a list.
    so its size "3".



  • @mrjj Thank you for everything !


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.