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

后端 未结 6 847
Happy的楠姐
Happy的楠姐 2020-12-05 18:00

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

相关标签:
6条回答
  • 2020-12-05 18:17

    Use text formated as HTML, for example:

    textEdit->setHtml(text);
    

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

    0 讨论(0)
  • 2020-12-05 18:25

    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);
    
    0 讨论(0)
  • 2020-12-05 18:26

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

    0 讨论(0)
  • 2020-12-05 18:28

    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 );
    
    0 讨论(0)
  • 2020-12-05 18:28

    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!" );
    ...
    
    0 讨论(0)
  • 2020-12-05 18:31

    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.

    0 讨论(0)
提交回复
热议问题