2012-06-19 20 views
7

Tengo una aplicación GUI cuya parte principal es QPlainTextEdit. Se usa para mostrar un registro de la aplicación y, como tal, el texto asociado crece línea por línea hasta el infinito.QPlainTextEdit truncate history linewise

Como la aplicación está destinada a ejecutarse por mucho tiempo, debo limitar la memoria que se asignará para este registro. Por lo tanto, quiero tener algún parámetro maxNumLines o maxNumCharacters que asegure que el historial se truncará cuando se llegue, es decir, las líneas se eliminarán a medida que se añadan nuevas líneas (a.k.a. rotación de registros).

Para lograr esta me encontré con las funciones

// get the associated text 
QString toPlainText() const 

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

Por lo tanto algo así como el código no probado, probablemente haría el truco:

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

Es este el camino a seguir para eliminar la primera línea (s) del QPlainTextEdit? ¿Hay probablemente otros elementos de GUI de Qt Text que se ajusten mejor a esta tarea (establecer un número máximo de líneas y truncar al principio de la lista), p. de alguna manera mostrar un QStringList en el que podría almacenar las líneas (por ejemplo, podría fácilmente erase(0))?

¿O el QPlainTextEdit eventualmente implementa dicho límite superior para el tamaño del QString asociado después de todo?

Respuesta

10

Aparentemente la propiedad maximumBlockCount es exactamente lo que necesito:

Si desea limitar el número total de los párrafos de un QPlainTextEdit, ya que es útil por ejemplo en un visor de registro, a continuación, puede utilizar la maximumBlockCount propiedad. La combinación de setMaximumBlockCount() y appendPlainText() convierte QPlainTextEdit en un visor eficiente para el texto de registro.

Como referencia:

+0

Gracias por compartir. Anteriormente estaba usando la inserción basada en cursor, pero descubrí que los métodos 'append *' proporcionarán desempeños mucho más altos. – AkiRoss

8

Tuve exactamente el mismo problema hace unos meses, y terminé usando un QListView. Aunque el uso de la arquitectura de modelo/vista/delegado es un poco más complicado, se escala mucho mejor a largo plazo. Por ejemplo, una vez que la arquitectura básica está en su lugar, agregar un filtro que muestra solo entradas de error o advertencia se vuelve trivial, o crear un delegado para que el fondo de las entradas de error se pinten de rojo también es sencillo.

Cuestiones relacionadas