2012-06-19 15 views
7

Mam aplikację GUI, której główną częścią jest QPlainTextEdit. Służy do wyświetlania dziennika aplikacji i jako taki powiązany tekst rośnie linia po linii w nieskończoność.QPlainTextEdit truncate history linewise

Ponieważ aplikacja ma działać bardzo długo, muszę ograniczyć ilość pamięci, która zostanie przydzielona dla tego dziennika. Dlatego chcę mieć pewien parametr, który zapewni, że historia zostanie obcięta po osiągnięciu, tj. Linie nagłówkowe zostaną usunięte, gdy dodawane są nowe linie (a.k.a. obrót dziennika).

Aby to osiągnąć znalazłem z funkcji

// get the associated text 
QString toPlainText() const 

// set the associated text 
void setPlainText (const QString & text) 

Dlatego coś takiego kodu nietestowanego prawdopodobnie rade:

QString &tmp = pte.toPlainText(); 
while (tmp.size() > maxNumCharacters) { 
    // remove lines from the head of the string until the desired size is reached 
    // removes nothing if "\n" could not be found 
    tmp.remove(0, tmp.indexOf("\n")+1); 
} 
pte.setPlainText(tmp); 

Jest to do zrobienia, aby usunąć pierwszą linię (s) z QPlainTextEdit? Czy są prawdopodobnie inne elementy GUI Qt Text, które lepiej pasują do tego zadania (ustaw maksymalną liczbę linii i obetnij na początku listy), np. jakoś wyświetlić QStringList, w którym mogłem przechowywać linie (s.t. Mogłem łatwo erase(0))?

A może QPlainTextEdit ostatecznie implementuje taką górną granicę dla rozmiaru skojarzonego QStringa?

Odpowiedz

10

Apparantly własnością maximumBlockCount jest dokładnie to, czego potrzebuję:

Jeśli chcesz ograniczyć całkowitą liczbę akapitów w QPlainTextEdit, jak to jest na przykład przydatne w przeglądarce dziennika, a następnie można użyć maximumBlockCount własność. Kombinacja setMaximumBlockCount() i appendPlainText() zamienia QPlainTextEdit w wydajną przeglądarkę dla tekstu dziennika.

Dla porównania:

+0

Dzięki za dzielenie się. Poprzednio używałem wstawiania opartego na kursorach, ale odkryłem, że metody 'append *' zapewniają znacznie lepsze wyniki. – AkiRoss

8

Miałem dokładnie ten sam problem kilka miesięcy temu, a ja skończyłem używając QListView. Chociaż korzystanie z architektury model/widok/delegata jest nieco bardziej skrzypiące, na dłuższą metę znacznie się skaluje. Na przykład, gdy podstawowa architektura jest na miejscu, dodanie filtra, który wyświetla tylko wpisy o błędach lub ostrzeżeniach staje się banalne, lub tworzenie delegata, aby tło wpisów błędów były pomalowane na czerwono, jest również proste.

Powiązane problemy