2012-06-19 12 views
7

Ho un'applicazione GUI la cui parte principale è una QPlainTextEdit. È usato per visualizzare un log dell'applicazione, e come tale il testo associato cresce linea per linea all'infinito.QPlainTextEdit cronologia troncata linewise

Poiché l'applicazione deve funzionare molto a lungo, è necessario limitare la memoria che verrà allocata per questo registro. Pertanto voglio avere qualche parametro maxNumLines o maxNumCharacters che si assicurerà che la cronologia venga troncata quando viene raggiunta, cioè le linee di testa verranno rimosse quando vengono aggiunte nuove linee (a.k.a rotazione del registro).

per raggiungere questo obiettivo ho trovato le funzioni

// get the associated text 
QString toPlainText() const 

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

Quindi qualcosa di simile a questo codice non testato sarebbe probabilmente fare il trucco:

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

E 'questa la strada da percorrere per rimuovere la prima linea (s) dallo QPlainTextEdit? Ci sono probabilmente altri elementi della GUI di Qt Text che si adattano meglio a questa attività (imposta un numero massimo di linee e troncati all'inizio dell'elenco), ad es. in qualche modo visualizzare uno QStringList in cui potrei memorizzare le linee (potrebbe facilmente erase(0))?

Oppure il QPlainTextEdit eventualmente implementa tale limite superiore per la dimensione della QString associata, dopo tutto?

risposta

10

quanto pare la proprietà maximumBlockCount è esattamente quello che mi serve:

Se si vuole limitare il numero totale dei paragrafi in una QPlainTextEdit, come lo è per esempio utile in un visualizzatore di log, quindi è possibile utilizzare il maximumBlockCount proprietà. La combinazione di setMaximumBlockCount() e appendPlainText() trasforma QPlainTextEdit in un efficiente visualizzatore per il testo del registro.

Per riferimento:

+0

Grazie per la condivisione. In precedenza utilizzavo l'inserimento basato sul cursore, ma ho scoperto che i metodi 'append *' forniranno prestazioni molto più elevate. – AkiRoss

8

Ho avuto esattamente lo stesso problema un mese fa, e ho finito per usare un QListView. Anche se l'utilizzo dell'architettura modello/vista/delegato è un po 'più complicato, nel lungo termine migliora notevolmente. Ad esempio, una volta installata l'architettura di base, l'aggiunta di un filtro che visualizza solo le voci di errore o di avvertimento diventa banale o la creazione di un delegato in modo che lo sfondo delle voci di errore sia dipinto in rosso è anche semplice.