QTextEdit с разными цветами текста (Qt / C ++) - PullRequest
26 голосов
/ 18 мая 2010

У меня есть поле QTextEdit, в котором отображается текст, и я хотел бы иметь возможность установить цвет текста для разных строк текста в одном поле QTextEdit. (то есть строка 1 может быть красной, строка 2 может быть черной и т. д.)

Возможно ли это в коробке QTextEdit? Если нет, какой самый простой способ получить это поведение?

Спасибо.

Ответы [ 6 ]

31 голосов
/ 04 августа 2011

ТОЛЬКО вещь, которая работала для меня, была 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);
27 голосов
/ 18 мая 2010

Просто быстрое добавление: альтернативой генерации html самостоятельно, если вы заполняете текстовое поле программно, является использование textEdit->setTextColor(QColor&).Вы можете создать объект QColor самостоятельно или использовать один из предопределенных цветов в пространстве имен Qt (Qt :: black, Qt :: red и т. Д.).Он будет применять указанный цвет к любому тексту, который вы добавляете, пока он снова не будет вызван другим.

24 голосов
/ 18 мая 2010

Использовать текст в формате HTML, например:

textEdit->setHtml(text);

где текст , текст в формате HTML, содержит цветные линии и т. Д.

11 голосов
/ 08 ноября 2012

Ссылка на документ

Несколько цитат:

QTextEdit - это расширенный просмотрщик / редактор WYSIWYG, поддерживающий форматирование с расширенным текстом с использованием Теги в стиле 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 );
8 голосов
/ 25 июня 2013

Расширение на 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!" );
...
0 голосов
/ 24 января 2019

Это мое решение для очень простой регистрации ошибок с использованием 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();
}

Вот как это выглядит:

enter image description here

Конечно, вы можете добавить дату / время и другие интересные вещи:)

...