2012-01-24 13 views
5

Problema: Quiero implementar un widget de edición de texto para texto con etiquetas adicionales. Me gustaría que algunas etiquetas sean invisibles en algunos casos para que no distraigan al usuario.Ocultar texto con QSyntaxHighlighter

Medio Ambiente: estoy usando PyQt y prefieren utilizar QPlainTextWidget y QSyntaxHighlighter.

Approach: Con QSyntaxHighlighter Puedo configurar QTextCharFormat para las cadenas que coincidan con mis requisitos. QTextCharFormat me da todas las propiedades de fuente como tamaño, colores, etc. pero: No he encontrado una opción para ocultar el texto o reducir su tamaño a cero.

No quiero quitar o reemplazar las etiquetas, ya que esto introducirá mucho más código (la copia debe contener etiquetas y sin I no puede usar QSyntaxHighlighter para formatear el texto restante de acuerdo con las etiquetas).

Actualización: Hasta ahora encontré un hack feo. Al establecer QTextFormat :: FontLetterSpacing en un valor pequeño, el texto consumirá menos y menos espacio. En combinación con un color transparente, el texto es algo así como invisible.

Problema: En mi prueba, esto solo funcionaba con espaciamientos de letras de hasta 0.016%. Debajo del espaciado se resetea al 100%.

+0

Bueno, texto sin formato es texto sin formato. Intenta usar el widget no simple. –

+0

No he encontrado las opciones correspondientes en 'QTextEdit'. AFAIK la diferencia se limita al comportamiento de desplazamiento, tablas, marcos y cosas como imágenes. Las funciones que pueden permitir ocultar el texto son las mismas que para 'QPlainTextEdit'. Aparte de eso, hay clases más avanzadas dentro de Qt. QScintilla significaría usar algo completamente diferente. – m2j

Respuesta

3

Puede usar el QTextDocument subyacente para esto. Consiste en bloques cuya visibilidad se puede activar y desactivar usando setVisible. Use un QTextCursor para insertar el texto y los nuevos bloques y cambiar la visibilidad. Como beneficio adicional, la función de copia copia el contenido de bloques no visibles de todos modos.

Notas: Consulte el documentation de QTextCursor para obtener más información. En another question aquí se informó que establecer la visibilidad no funciona en QTextEdits.

Ejemplo:

from PyQt5 import QtWidgets, QtGui 

app = QtWidgets.QApplication([]) 

w = QtWidgets.QPlainTextEdit() 
w.show() 

t = QtGui.QTextCursor(w.document()) 
t.insertText('plain text') 
t.insertBlock() 
t.insertText('tags, tags, tags') 
t.block().setVisible(False) 

print(w.document().toPlainText()) 

app.exec_() 
Cuestiones relacionadas