2012-01-24 13 views
5

Problema: Voglio implementare un widget di modifica del testo per il testo con tag aggiuntivi. Mi piacerebbe che alcuni tag siano invisibili in alcuni casi, in modo da non distrarre l'utente.Nascondere il testo con QSyntaxHighlighter

Ambiente: sto usando PyQt e preferiscono usare QPlainTextWidget e QSyntaxHighlighter.

Metodo: Con QSyntaxHighlighter Posso impostare QTextCharFormat per le stringhe che corrispondono al mio requisito. QTextCharFormat mi offre tutte le proprietà dei caratteri come dimensione, colori, ecc. ma: Non ho trovato un'opzione per nascondere il testo o ridurne le dimensioni a zero.

Non voglio rimuovere o sostituire i tag, in quanto ciò introdurrà molto più codice (la copia dovrebbe contenere tag e senza I non è possibile utilizzare QSyntaxHighlighter per formattare il testo rimanente in base ai tag).

Aggiornamento: Finora ho trovato un brutto trucco. Impostando QTextFormat :: FontLetterSpacing su un valore piccolo, il testo consumerà sempre meno spazio. In combinazione con un colore trasparente, il testo è qualcosa di invisibile.

Problema: Nel mio test questo ha funzionato solo per le spaziature delle lettere fino allo 0,016%. Sotto la spaziatura viene resettato al 100%.

+0

Beh, solo testo è il testo normale. Prova ad usare il widget non semplice. –

+0

Non ho trovato le opzioni corrispondenti in 'QTextEdit'. AFAIK la differenza è limitata al comportamento di scorrimento, tabelle, cornici e cose come le immagini. Le funzioni che potrebbero consentire di nascondere il testo sono le stesse di "QPlainTextEdit'. Altro poi che ci sono mo classi più avanzate all'interno di Qt. QScintilla significherebbe usare qualcosa di completamente diverso. – m2j

risposta

3

Per questo è possibile utilizzare il sottostante QTextDocument. Consiste di blocchi la cui visibilità può essere attivata e disattivata utilizzando setVisible. Utilizzare un QTextCursor per inserire il testo e i nuovi blocchi e cambiare la visibilità. Come bonus, la funzione di copia copia comunque il contenuto dei blocchi non visibili.

Note: vedere documentation di QTextCursor per ulteriori informazioni. In another question è stato riportato che l'impostazione della visibilità non funziona su QTextEdits.

Esempio:

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_()