【发布时间】:2011-02-20 22:05:14
【问题描述】:
我有一个显示文本的QTextEdit 框,我希望能够为同一个QTextEdit 框中的不同文本行设置文本颜色。 (即第 1 行可能是红色,第 2 行可能是黑色等)
这可能在QTextEdit 框中吗?如果没有,获得这种行为的最简单方法是什么?
谢谢。
【问题讨论】:
我有一个显示文本的QTextEdit 框,我希望能够为同一个QTextEdit 框中的不同文本行设置文本颜色。 (即第 1 行可能是红色,第 2 行可能是黑色等)
这可能在QTextEdit 框中吗?如果没有,获得这种行为的最简单方法是什么?
谢谢。
【问题讨论】:
这是我使用 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();
}
看起来是这样的:
当然,您可以继续添加日期/时间和其他很酷的东西:)
【讨论】:
扩展至https://stackoverflow.com/a/13287446/1619432:
QTextEdit::append() 使用之前设置的 FontWeight / TextColor 插入一个新段落。
insertHTML() 或 InsertPlainText() 为避免插入新段落(例如在单行中实现不同格式),请不要遵守字体/颜色设置。
改为使用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!" );
...
【讨论】:
format.setForeground( QBrush( QColor( "white" ) ) ); 和 cursor.setCharFormat( format ); 和 cursor.insertText( "This line is white" );。
引用几句:
QTextEdit 是一种高级的所见即所得查看器/编辑器,支持富文本格式,使用 HTML 样式的标签。它经过优化以处理大型文档并快速响应 用户输入。
.
文本编辑可以加载纯文本和 HTML 文件(HTML 3.2 和 4 的子集)。
.
QTextEdit 可以显示较大的 HTML 子集,包括表格和图像。
这意味着大部分已弃用的标签,因此不包括任何当前的 CSS,所以我转向这个:
// 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 );
【讨论】:
仅对我有用的是 html。
代码 sn-p 如下。
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);
【讨论】:
只是一个快速补充:如果您以编程方式填充文本框,则您自己生成 html 的另一种方法是使用textEdit->setTextColor(QColor&)。您可以自己创建 QColor 对象,或者使用 Qt 命名空间中的一种预定义颜色(Qt::black、Qt::red 等)。它会将指定的颜色应用于您添加的任何文本,直到它再次被另一个调用。
【讨论】:
使用 HTML 格式的文本,例如:
textEdit->setHtml(text);
其中文本,是HTML格式的文本,包含彩色线条等。
【讨论】: