2012-01-24 19 views
5

Problem: Chcę zaimplementować widget edytowania tekstu dla tekstu z dodatkowymi tagami. Chciałbym, aby niektóre znaczniki były niewidoczne w niektórych przypadkach, aby nie rozpraszały użytkownika.Ukrywanie tekstu za pomocą narzędzia QSyntaxHighlighter

Środowisko: Używam PyQt i wolą korzystać QPlainTextWidget i QSyntaxHighlighter.

Podejście: Z QSyntaxHighlighter mogę ustawić QTextCharFormat dla ciągów pasujących do mojego wymagania. QTextCharFormat dał mi wszystkie właściwości czcionki, takie jak rozmiar, kolory itp. , ale: Nie znalazłem opcji, aby ukryć tekst lub zmniejszyć jego rozmiar do zera.

Nie chcę usuwać ani zastępować tagów, ponieważ wprowadzi to znacznie więcej kodu (kopiowanie powinno zawierać znaczniki i nie mogę używać QSyntaxHighlighter do formowania pozostałego tekstu zgodnie z tagami).

Aktualizacja: Do tej pory znalazłem brzydki hack. Po ustawieniu wartości QTextFormat :: FontLetterSpacing na małą wartość tekst będzie zużywał coraz mniej miejsca. W połączeniu z przezroczystym kolorem tekst jest niewidoczny.

Problem: W moim teście zadziałało to tylko dla odstępów między literami do 0,016%. Poniżej odstępy są resetowane do 100%.

+0

No tekstowy jest tekstowym. Spróbuj użyć widgetu innego niż zwykły. –

+0

Nie znalazłem odpowiednich opcji w 'QTextEdit'. AFAIK różnica jest ograniczona do zachowania przewijania, tabel, ramek i rzeczy takich jak obrazy. Funkcje, które mogą umożliwić ukrywanie tekstu, są takie same, jak w 'QPlainTextEdit'. Poza tym istnieje więcej bardziej zaawansowanych klas wewnątrz Qt. QScintilla oznaczałoby użycie czegoś zupełnie innego. – m2j

Odpowiedz

3

Można użyć do tego podstawowej QTextDocument. Składa się z bloków, których widoczność można włączać i wyłączać za pomocą setVisible. Użyj QTextCursor, aby wstawić tekst i nowe bloki oraz zmienić widoczność. Jako bonus funkcja kopiowania i tak kopiuje zawartość niewidocznych bloków.

Uwagi: Aby uzyskać więcej informacji, zobacz documentation z QTextCursor. W dokumencie another question podano, że ustawienie widoczności nie działa na QTextEdits.

przykład:

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_() 
Powiązane problemy