2010-05-18 21 views
23

Tengo un QTextEdit cuadro que muestra texto, y me gustaría ser capaz de establecer el color del texto para diferentes líneas de texto en el mismo cuadro QTextEdit. (es decir, la línea 1 podría ser roja, la línea 2 podría ser negra, etc.)QTextEdit con diferentes colores de texto (Qt/C++)

¿Es esto posible en una caja de QTextEdit? Si no, ¿cuál es la forma más fácil de obtener este comportamiento?

Gracias.

Respuesta

20

Uso de texto con formato HTML como, por ejemplo:

textEdit->setHtml(text); 

donde texto, es un texto con formato HTML, contiene con líneas de color y etc

23

Sólo una adición rápida: una alternativa a generar el html usted mismo, si está completando el cuadro de texto de forma programática, es usar textEdit->setTextColor(QColor&). Puede crear el objeto QColor usted mismo, o usar uno de los colores predefinidos en el espacio de nombres Qt (Qt :: black, Qt :: red, etc.). Aplicará el color especificado a cualquier texto que agregue, hasta que se vuelva a llamar con uno diferente.

+2

Esto es, con mucho, la solución más simple para hacerlo. Funciona como un amuleto, por ejemplo, para el registro, donde cada línea se colorea de acuerdo con la gravedad del mensaje. – SirDarius

+0

pero esto solo colorea todo el texto presente, quiero colorear cada color con un color diferente, ¿pueden ayudarme con eso? –

+1

Si está utilizando un objeto 'textEdit', coloreará el texto de cada llamada 'anexada' con un color diferente. –

28

El SOLO lo que funcionó para mí fue html.

Fragmento de código a continuación.

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

Unas pocas citas:

QTextEdit es un avanzado visor WYSIWYG/editor de apoyo formato de texto enriquecido utilizando etiquetas de estilo HTML. Está optimizado para manejar documentos grandes y responder rápidamente a la entrada del usuario .

.

La edición de texto puede cargar tanto texto sin formato como archivos HTML (un subconjunto de HTML 3.2 y 4).

.

QTextEdit puede mostrar un gran subconjunto HTML, que incluye tablas e imágenes.

Esto significa que las etiquetas sobre todo en desuso y, como tal, no incluye ninguna CSS actual, por lo que volvió a esto:

// 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 para establecer los atributos y luego agregarlo – Niklas

6

Extendiéndose sobre https://stackoverflow.com/a/13287446/1619432:

QTextEdit::append() inserta un nuevo párrafo con el anteriormente establecer FontWeight/TextColor. insertHTML() o InsertPlainText() para evitar insertar un nuevo párrafo (por ejemplo, para lograr diferentes formatos en una sola línea) no respetan las configuraciones de fuente/color.

lugar de utilizar 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 para 'ìnsertText' – Niklas

+0

esta respuesta me enseñó cosas nuevas –

+0

Esto terminó funcionando para mí. Una línea es de un color y la siguiente línea es de un color diferente. En este ejemplo, después de "Hello World", pondría las líneas 'format.setForeground (QBrush (QColor (" white ")));' y 'cursor.setCharFormat (format);' y 'cursor.insertText (" This line es blanco ");'. – orbit

Cuestiones relacionadas