Reputation: 695
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
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
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:
Of course, you can go ahead and add date/time and other cool stuff :)
Upvotes: 4
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
Reputation: 121
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
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
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
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