2012-06-19 19 views
7

Ich habe eine GUI-Anwendung, deren Hauptteil ist ein QPlainTextEdit. Es wird verwendet, um ein Protokoll der Anwendung anzuzeigen, und somit wächst der zugehörige Text Zeile für Zeile ad infinitum.QPlainTextEdit truncate Geschichte zeilenweise

Da die Anwendung sehr lange laufen soll, muss ich den Speicher begrenzen, der für dieses Protokoll zugewiesen wird. Deshalb möchte ich einen maxNumLines oder maxNumCharacters Parameter haben, der sicherstellt, dass der Verlauf abgeschnitten wird, wenn er erreicht wird, d.h. die Kopfzeilen werden entfernt, wenn neue Zeilen angehängt werden (a.k.a. log rotation).

Um dies zu erreichen, finde ich die Funktionen

// get the associated text 
QString toPlainText() const 

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

Deshalb so etwas wie dieser ungetestete Code tun würde wahrscheinlich den Trick:

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); 

Ist das der Weg, um die erste Zeile zu entfernen, zu gehen (s) aus der QPlainTextEdit? Gibt es wahrscheinlich andere Qt Text GUI-Elemente, die besser zu dieser Aufgabe passen würden (eine maximale Anzahl von Zeilen festlegen und am Anfang der Liste abschneiden), z. zeige irgendwie eine QStringList in der ich die Zeilen speichern könnte (s.t. könnte ich leicht erase(0))?

Oder implementiert QPlainTextEdit schließlich eine solche Obergrenze für die Größe des zugeordneten QString?

Antwort

10

Apparantly Eigentum maximumBlockCount ist genau das, was ich brauche:

Wenn Sie die Gesamtzahl der Absätze in einem QPlainTextEdit beschränken möchten, wie es zum Beispiel nützlich in einem Log-Viewer ist, dann können Sie mit dem maximumBlockCount Eigentum. Die Kombination setMaximumBlockCount() und appendPlainText() macht aus QPlainTextEdit einen effizienten Viewer für Log-Text.

Zum Vergleich:

+0

Dank für die gemeinsame Nutzung. Ich habe zuvor die cursorbasierte Einfügung verwendet, aber ich habe entdeckt, dass 'append *' -Methoden viel höhere Leistungen bieten. – AkiRoss

8

Ich hatte genau das gleiche Problem vor einem Monat zurück, und ich endete mit einer QListView. Obwohl die Verwendung der Model/View/Delegate-Architektur ein bisschen fummeliger ist, skaliert sie auf lange Sicht viel besser. Zum Beispiel, sobald die grundlegende Architektur vorhanden ist, wird das Hinzufügen eines Filters, der nur Fehler- oder Warneinträge anzeigt, trivial, oder das Erstellen eines Delegaten, so dass der Hintergrund von Fehlereinträgen rot dargestellt wird, ist ebenfalls einfach.