Подтвердить что ты не робот

QTextEdit с разными цветами текста (Qt/С++)

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

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

Спасибо.

4b9b3361

Ответ 1

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

textEdit->setHtml(text);

где текст, представляет собой HTML-форматированный текст, содержащий цветные строки и т.д.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Продолжение на fooobar.com/questions/232393/...:

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

Ответ 6

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

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