user924
user924

Reputation: 695

QTextEdit with different text colors (Qt / C++)

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.

Upvotes: 37

Views: 86862

Answers (7)

memmove
memmove

Reputation: 1

Wow, this is a immemorial problem...But anyway, it comes to me now, and just like @badgerr said, after you calling setTextColor(QColor& colorA), the color of the text you append after that will be colorA until you set the color again. It will not change the color of text you appended before you set the textColor.

ui->textBrowser->clear();
auto colorIte = colorList->begin();
while(colorIte != colorList->end())
{
    ui->textBrowser->setTextColor(*colorIte);
    ui->textBrowser->append(QString("RGB(%1, %2, %3)").arg(colorIte->red()) 
             .arg(colorIte->green()).arg(colorIte->blue()));
    colorIte++;
}

the colorList stores some QColor objects, this code snippet show the color in RGB format with the color it represents.

Upvotes: 0

Dumbo
Dumbo

Reputation: 14112

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 :)

Upvotes: 4

handle
handle

Reputation: 6319

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!" );
...

Upvotes: 12

none
none

Reputation: 121

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 );

Upvotes: 12

paie
paie

Reputation: 519

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);

Upvotes: 37

badgerr
badgerr

Reputation: 7982

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.

Upvotes: 44

mosg
mosg

Reputation: 12381

Use text formated as HTML, for example:

textEdit->setHtml(text);

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

Upvotes: 25

Related Questions