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.
Utilisez un texte au format HTML, par exemple:
textEdit->setHtml(text);
où text , est un texte au format HTML, contient des lignes colorées, etc.
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);
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.
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 );
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!" );
...
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:
Bien sûr, vous pouvez y aller et ajouter la date/heure et d'autres choses intéressantes :)