2010-05-18 14 views
23

Ho una casella QTextEdit che visualizza il testo e mi piacerebbe poter impostare il colore del testo per diverse righe di testo nella stessa casella QTextEdit. (ad esempio, la linea 1 potrebbe essere rossa, la linea 2 potrebbe essere nera, ecc.)QTextEdit con colori di testo diversi (Qt/C++)

E 'possibile in una casella QTextEdit? In caso contrario, qual è il modo più semplice per ottenere questo comportamento?

Grazie.

risposta

20

Utilizzare testo formattato come HTML, per esempio:

textEdit->setHtml(text); 

in cui il testo , è un testo HTML formattato, contiene con linee colorate, ecc

23

Solo una breve aggiunta: un'alternativa alla generando il codice html da soli, se si sta compilando la casella di testo in modo programmatico, si utilizza textEdit->setTextColor(QColor&). È possibile creare l'oggetto QColor da soli oppure utilizzare uno dei colori predefiniti nello spazio dei nomi Qt (Qt :: black, Qt :: red, ecc.). Applica il colore specificato a qualsiasi testo che aggiungi, finché non viene richiamato con uno diverso.

+2

Questo è di gran lunga la soluzione più semplice per farlo. Funziona come un fascino per esempio per la registrazione, in cui ogni linea è colorata in base alla gravità del messaggio. – SirDarius

+0

ma questo solo colora tutto il testo presente, voglio colorare ogni colore con un colore diverso, per favore puoi aiutarmi con quello? –

+1

Se si utilizza un oggetto "textEdit", colorerà il testo di ogni chiamata "append" con un colore diverso. –

28

Il SOLO cosa che ha funzionato per me era html.

Segmento di snippet di codice.

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

Link to doc

Qualche citazione:

QTextEdit è un visualizzatore di WYSIWYG/editor avanzato di supporto formato RTF utilizzando tag HTML in stile. È ottimizzato per gestire documenti di grandi dimensioni e per rispondere rapidamente all'input dell'utente .

.

La modifica del testo può caricare sia file di testo che HTML (un sottoinsieme di HTML 3.2 e 4).

.

QTextEdit può visualizzare un grande sottoinsieme HTML, incluse tabelle e immagini.

Ciò significa tag in gran parte obsolete e come tale non include alcuna corrente CSS, così ho girato a questo:

// 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

+1 per impostare gli attributi e quindi aggiungerlo – Niklas

6

Estendendosi su https://stackoverflow.com/a/13287446/1619432:

QTextEdit::append() inserisce un nuovo paragrafo con il già imposta FontWeight/TextColor. insertHTML() o InsertPlainText() per evitare di inserire un nuovo paragrafo (ad esempio per ottenere diversi formati in una singola riga) non rispettare le impostazioni di carattere/colore.

Invece utilizzare 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!"); 
... 
+1

+1 per 'ìnsertText' – Niklas

+0

questa risposta mi ha insegnato cose nuove –

+0

Questo ha funzionato per me. Una linea è di un colore e la riga successiva è di un colore diverso. In questo esempio, dopo "Hello World", si inseriscono le righe 'format.setForeground (QBrush (QColor (" white ")));' e 'cursor.setCharFormat (formato);' e 'cursor.insertText (" Questa riga è bianco ");'. – orbit