QTextEdit 具有不同的文本颜色(Qt / C++)

问题描述 投票:0回答:7

我有一个显示文本的

QTextEdit
框,我希望能够在同一个
QTextEdit
框中设置不同文本行的文本颜色。 (即第 1 行可能是红色,第 2 行可能是黑色,等等)

这可以在

QTextEdit
盒子里实现吗?如果没有,实现这种行为的最简单方法是什么?

谢谢。

c++ qt colors qtextedit
7个回答
41
投票

快速补充一下:如果您以编程方式填充文本框,则可以使用

textEdit->setTextColor(QColor&)
来自行生成 html。您可以自己创建 QColor 对象,或使用 Qt 命名空间中的预定义颜色之一(Qt::black、Qt::red 等)。它将把指定的颜色应用于您添加的任何文本,直到使用不同的颜色再次调用。


36
投票

唯一对我有用的是html。

代码片段如下。

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

25
投票

使用 HTML 格式的文本,例如:

textEdit->setHtml(text);

其中text,是HTML格式的文本,包含彩色线条等。


12
投票

文档链接

摘录几段:

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

12
投票

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

4
投票

这是我使用 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();
}

这就是它的样子:

当然,您可以继续添加日期/时间和其他很酷的东西:)


0
投票

哇,这是一个古老的问题......但无论如何,它现在出现在我身上,就像@badgerr所说,在你调用setTextColor(QColor& colorA)之后,你追加的文本的颜色将是colorA,直到你再次设置颜色。它不会更改您在设置 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++;
}

colorList 存储一些 QColor 对象,此代码片段显示 RGB 格式的颜色及其代表的颜色。

© www.soinside.com 2019 - 2024. All rights reserved.