web-dev-qa-db-fra.com

QTextEdit avec différentes couleurs de texte (Qt/C++)

J'ai une boîte QTextEdit qui affiche du texte et j'aimerais pouvoir définir la couleur du texte pour différentes lignes de texte dans la même boîte QTextEdit. (c’est-à-dire que la ligne 1 peut être rouge, la ligne 2 peut être noire, etc.)

Est-ce possible dans une boîte QTextEdit? Si non, quel est le moyen le plus simple d’obtenir ce comportement?

Merci.

26
user924

Utilisez un texte au format HTML, par exemple:

textEdit->setHtml(text);

text , est un texte au format HTML, contient des lignes colorées, etc.

24
mosg

LeSEULEMENTchose qui a fonctionné pour moi était le HTML. 

L'extrait de code suit. 

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

Juste un ajout rapide: une alternative à la génération du code HTML vous-même, si vous remplissez la zone de texte par programme, consiste à utiliser textEdit->setTextColor(QColor&). Vous pouvez créer l'objet QColor vous-même ou utiliser l'une des couleurs prédéfinies dans l'espace de noms Qt (Qt :: black, Qt :: red, etc.). Il appliquera la couleur spécifiée à tout texte ajouté, jusqu'à ce qu'il soit appelé à nouveau avec un autre.

27
badgerr

Lien vers doc

Quelques citations:

QTextEdit est un visualiseur/éditeur WYSIWYG avancé prenant en charge le formatage de texte enrichi à l'aide de Balises de style HTML. Il est optimisé pour gérer des documents volumineux et pour répondre rapidement à entrée utilisateur.

.

L'édition de texte peut charger à la fois du texte brut et des fichiers HTML (un sous-ensemble de HTML 3.2 et 4).

.

QTextEdit peut afficher un grand sous-ensemble HTML, y compris des tableaux et des images.

Cela signifie que la plupart des balises sont déconseillées et qu’elles n'incluent donc pas les feuilles de style CSS actuelles.

// 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 );
10
none

Extension sur https://stackoverflow.com/a/13287446/1619432 :

QTextEdit::append() insère un nouveau paragraphe avec les valeurs FontWeight/TextColor .insertHTML() ou InsertPlainText() précédemment définies pour éviter d'insérer un nouveau paragraphe (par exemple, pour obtenir différents formats sur une seule ligne) sans respecter les paramètres de police/couleur.

Utilisez plutôt 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!" );
...
8
handle

Ceci est ma solution pour une erreur très simple de journalisation utilisant 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();
}

C'est à ça que ça ressemble:

 enter image description here

Bien sûr, vous pouvez y aller et ajouter la date/heure et d'autres choses intéressantes :)

0
Saeid Yazdani