Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to change font weight at various locations within a QTextEdit
QtWS25 Last Chance

How to change font weight at various locations within a QTextEdit

Scheduled Pinned Locked Moved Solved General and Desktop
22 Posts 2 Posters 10.1k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    mulfycrowh
    wrote on last edited by
    #1

    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.

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #2

      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

      1 Reply Last reply
      2
      • M Offline
        M Offline
        mulfycrowh
        wrote on last edited by
        #3

        Thank you I'll take a look

        1 Reply Last reply
        0
        • M Offline
          M Offline
          mulfycrowh
          wrote on last edited by
          #4

          Is it the only way ? I find it a little bit tricky, just to write a line (title) with a bigger font weight ...

          mrjjM 1 Reply Last reply
          0
          • M mulfycrowh

            Is it the only way ? I find it a little bit tricky, just to write a line (title) with a bigger font weight ...

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by mrjj
            #5

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

            1 Reply Last reply
            2
            • M Offline
              M Offline
              mulfycrowh
              wrote on last edited by
              #6

              What do you think about the following thread :

              http://www.qtcentre.org/threads/24331-How-to-set-text-and-font-in-qTextEdit

              1 Reply Last reply
              0
              • mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #7

                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.

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  mulfycrowh
                  wrote on last edited by
                  #8

                  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.

                  1 Reply Last reply
                  0
                  • mrjjM Offline
                    mrjjM Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    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 ?

                    1 Reply Last reply
                    1
                    • M Offline
                      M Offline
                      mulfycrowh
                      wrote on last edited by
                      #10

                      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.

                      1 Reply Last reply
                      0
                      • M Offline
                        M Offline
                        mulfycrowh
                        wrote on last edited by
                        #11

                        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 !

                        1 Reply Last reply
                        1
                        • mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by
                          #12

                          good found.
                          well a newline is \n\r on windows.
                          so maybe thats why with 2.

                          1 Reply Last reply
                          0
                          • M Offline
                            M Offline
                            mulfycrowh
                            wrote on last edited by
                            #13

                            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 !

                            1 Reply Last reply
                            0
                            • mrjjM Offline
                              mrjjM Offline
                              mrjj
                              Lifetime Qt Champion
                              wrote on last edited by
                              #14

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

                              M 1 Reply Last reply
                              0
                              • mrjjM mrjj

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

                                M Offline
                                M Offline
                                mulfycrowh
                                wrote on last edited by
                                #15

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

                                mrjjM 1 Reply Last reply
                                0
                                • M mulfycrowh

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

                                  mrjjM Offline
                                  mrjjM Offline
                                  mrjj
                                  Lifetime Qt Champion
                                  wrote on last edited by mrjj
                                  #16

                                  @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

                                  M 1 Reply Last reply
                                  0
                                  • mrjjM mrjj

                                    @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

                                    M Offline
                                    M Offline
                                    mulfycrowh
                                    wrote on last edited by
                                    #17

                                    @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 !

                                    mrjjM 1 Reply Last reply
                                    0
                                    • M mulfycrowh

                                      @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 !

                                      mrjjM Offline
                                      mrjjM Offline
                                      mrjj
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #18

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

                                      1 Reply Last reply
                                      0
                                      • M Offline
                                        M Offline
                                        mulfycrowh
                                        wrote on last edited by
                                        #19

                                        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);
                                        
                                        1 Reply Last reply
                                        1
                                        • M Offline
                                          M Offline
                                          mulfycrowh
                                          wrote on last edited by
                                          #20

                                          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.

                                          mrjjM 1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved