【问题标题】:QTextEdit with different text colors (Qt / C++)具有不同文本颜色的 QTextEdit (Qt / C++)
【发布时间】:2011-02-20 22:05:14
【问题描述】:

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

这可能在QTextEdit 框中吗?如果没有,获得这种行为的最简单方法是什么?

谢谢。

【问题讨论】:

    标签: c++ qt colors qtextedit


    【解决方案1】:

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

    看起来是这样的:

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

    【讨论】:

    • 问题在于原始文本的颜色取决于主题,可能是任何颜色,而不仅仅是黑色。
    【解决方案2】:

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

    【讨论】:

    • 这个答案教会了我新的东西
    • 这对我有用。一行是一种颜色,下一行是另一种颜色。在此示例中,在“Hello World”之后,您将添加行 format.setForeground( QBrush( QColor( "white" ) ) );cursor.setCharFormat( format );cursor.insertText( "This line is white" );
    【解决方案3】:

    Link to doc

    引用几句:

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

    【讨论】:

      【解决方案4】:

      对我有用的是 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);
      

      【讨论】:

        【解决方案5】:

        只是一个快速补充:如果您以编程方式填充文本框,则您自己生成 html 的另一种方法是使用textEdit-&gt;setTextColor(QColor&amp;)。您可以自己创建 QColor 对象,或者使用 Qt 命名空间中的一种预定义颜色(Qt::black、Qt::red 等)。它会将指定的颜色应用于您添加的任何文本,直到它再次被另一个调用。

        【讨论】:

        • 这是迄今为止最简单的解决方案。例如日志记录的魅力,其中每一行根据消息的严重性进行着色。
        • 但这只会给所有文本上色,我想用不同的颜色为每种颜色着色,你能帮我吗?
        • 如果您使用的是 'textEdit' 对象,它会用不同的颜色为每个 'append' 调用的文本着色。
        【解决方案6】:

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

        textEdit->setHtml(text);
        

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

        【讨论】:

        • 没有。这没有必要。
        猜你喜欢
        • 2019-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-07
        • 2020-08-09
        • 1970-01-01
        • 2013-10-08
        相关资源
        最近更新 更多