32

I have a QTextEdit box that displays text, and I'd like to be able to set the text color for different lines of text in the same QTextEdit box. (i.e. line 1 might be red, line 2 might be black, etc.)

Is this possible in a QTextEdit box? If not, what's the easiest way to get this behavior?

Thanks.

fat
  • 6,435
  • 5
  • 44
  • 70
user924
  • 635
  • 1
  • 9
  • 9

6 Answers6

41

Just a quick addition: an alternative to generating the html yourself, if you're populating the text box programatically, is to use textEdit->setTextColor(QColor&). You can create the QColor object yourself, or use one of the predefined colours in the Qt namespace (Qt::black, Qt::red, etc). It will apply the specified colour to any text you add, until it is called again with a different one.

badgerr
  • 7,802
  • 2
  • 28
  • 43
  • 3
    This is by far the simplest solution to do so. Works like a charm for example for logging, where each line is colored according to the message's severity. – SirDarius Nov 17 '14 at 17:58
  • but this only colors all the text present , i want to color each color with a diff color , can u please help me with that ? – Master Yoda Jun 17 '15 at 15:46
  • 1
    If you are using a 'textEdit' object, it will color the text of each 'append' call with a different color. – e-holder Apr 19 '16 at 16:38
36

The ONLY thing that worked for me was html.

Code snippet follows.

QString line = "contains some text from somewhere ..."
    :
    :
QTextCursor cursor = ui->messages->textCursor();
QString alertHtml = "<font color=\"DeepPink\">";
QString notifyHtml = "<font color=\"Lime\">";
QString infoHtml = "<font color=\"Aqua\">";
QString endHtml = "</font><br>";

switch(level)
{
    case msg_alert: line = alertHtml % line; break;
    case msg_notify: line = notifyHtml % line; break;
    case msg_info: line = infoHtml % line; break;
    default: line = infoHtml % line; break;
}

line = line % endHtml;
ui->messages->insertHtml(line);
cursor.movePosition(QTextCursor::End);
ui->messages->setTextCursor(cursor);
paie
  • 509
  • 5
  • 3
25

Use text formated as HTML, for example:

textEdit->setHtml(text);

where text, is a HTML formated text, contains with colored lines and etc.

mosg
  • 12,041
  • 12
  • 65
  • 87
12

Link to doc

A few quotes:

QTextEdit is an advanced WYSIWYG viewer/editor supporting rich text formatting using HTML-style tags. It is optimized to handle large documents and to respond quickly to user input.

.

The text edit can load both plain text and HTML files (a subset of HTML 3.2 and 4).

.

QTextEdit can display a large HTML subset, including tables and images.

This means mostly deprecated tags and as such does not include any current CSS, so I turned to this:

// save    
int fw = ui->textEdit->fontWeight();
QColor tc = ui->textEdit->textColor();
// append
ui->textEdit->setFontWeight( QFont::DemiBold );
ui->textEdit->setTextColor( QColor( "red" ) );
ui->textEdit->append( entry );
// restore
ui->textEdit->setFontWeight( fw );
ui->textEdit->setTextColor( tc );
Janak Nirmal
  • 22,706
  • 18
  • 63
  • 99
none
  • 121
  • 1
  • 2
11

Extending on https://stackoverflow.com/a/13287446/1619432:

QTextEdit::append() inserts a new paragraph with the previously set FontWeight / TextColor. insertHTML() or InsertPlainText() to avoid inserting a new paragraph (e.g. to achieve different formats in a single line) do not respect the font/color settings.

Instead use QTextCursor:

...
// textEdit->moveCursor( QTextCursor::End );
QTextCursor cursor( textEdit->textCursor() );

QTextCharFormat format;
format.setFontWeight( QFont::DemiBold );
format.setForeground( QBrush( QColor( "black" ) ) );
cursor.setCharFormat( format );

cursor.insertText( "Hello world!" );
...
Community
  • 1
  • 1
handle
  • 5,859
  • 3
  • 54
  • 82
  • 4
    this answer taught me new things – Master Yoda Jun 17 '15 at 17:16
  • This wound up working for me. One line is one color, and the next line is a different color. In this example, after "Hello World", you would put lines `format.setForeground( QBrush( QColor( "white" ) ) );` and `cursor.setCharFormat( format );` and `cursor.insertText( "This line is white" );`. – earth Mar 20 '16 at 08:19
4

This is my solution for a very simple error logging using QTextEdit.

// In some common header file
enum class ReportLevel {
    Info,
    Warning,
    Error
};

// Signal in classes who report something
void reportStatus(ReportLevel level,
                   const QString& tag,
                   const QString& report);

// Slot in the class which receives the reports
void MyGreatClass::handleStatusReport(ReportLevel level,
                                    const QString& tag,
                                    const QString& report)
{
    switch(level) {
        case ReportLevel::Info:
            mTeReports->setTextColor(Qt::blue);
            break;
        case ReportLevel::Warning:
            mTeReports->setTextColor(QColor::fromRgb(255, 165, 0)); // Orange
            break;
        case ReportLevel::Error:
            mTeReports->setTextColor(Qt::red);
            break;
    }

    // mTeReoports is just an instance of QTextEdit
    mTeReports->insertPlainText(tag + "\t");
    mTeReports->setTextColor(Qt::black); // set color back to black
    // might want ot use #ifdef for windows or linux....
    mTeReports->insertPlainText(report + "\r\n");

    // Force the scroll bar (if visible) to jump to bottom
    mTeReports->ensureCursorVisible();
}

This is how it looks like:

enter image description here

Of course, you can go ahead and add date/time and other cool stuff :)

Dumbo
  • 13,555
  • 54
  • 184
  • 288