¿Cómo debería vincular una clase de datos a mi código de interfaz gráfica de usuario (para mostrar los atributos del objeto, en C ++)?

StackOverflow https://stackoverflow.com/questions/786182

Pregunta

Tengo una clase (en C ++), lo llaman Data, que tiene miles de instancias (objetos) cuando se ejecuta el código. Tengo un widget (en Qt), llamarlo DataWidget que muestra los atributos de los objetos. Para construir rápidamente el widget Simplemente escribí los atributos del objeto en un archivo y había el widget analizar el archivo de los atributos -. Este enfoque funciona, pero no es escalable o bonito

Para ser más claro mis requisitos son:
1 - DataWidget debe ser capaz de mostrar múltiples, diferentes, los atributos del objeto Data a la vez
2 - DataWidget debe ser capaz de mostrar miles de objetos Data por segundo
3 - DataWidget se debe ejecutar a lo largo de lado el código que genera nuevos objetos Data
4 - cada objeto Data necesita ser salvado de forma permanente a archivo / base de datos

En la actualidad, se crea la interfaz gráfica de usuario y se crea el DataWidget continuación, se ejecuta el experimento y genera miles de objetos Data (escribiendo periódicamente algunos de ellos a archivo). Después del experimento corre el DataWidget muestra el último objeto Data por escrito para presentar (que se escriben en archivos XML).

Con mi método archivo actual puedo satisfacer (1) por el acaparamiento de más de un archivo después de ejecutar el experimento. Dado que el experimento no está ligado a DataWidget, no hay concurrencia, por lo que no puede hacer (3) hasta que añado una señal que informa al DataWidget que existe un nuevo archivo.

No se han desplazado hacia adelante con este enfoque por 2 razones: En primer lugar, a pesar de que los archivos no se escriben inmediatamente en el disco, no puedo imaginar que este método es escalable a menos que I implementar un sistema de almacenamiento en caché - pero, esto parece como si estuviera reinventar la rueda? En segundo lugar, Data es un contenedor para una estructura de datos del gráfico y estoy usando GraphML (a través de Boost Graph Library es decir, write_graphml () ) para escribir la estructura de archivos XML, y para leer la estructura de respaldo en con Boost read_graphml () me obliga a leer el archivo de nuevo en un objeto Data ... lo que significa la porción experimento del programa codifica el objeto en XML, escribe el código XML en un archivo (pero esperemos que en la memoria y no en el disco), entonces el DataWidget lee el código XML de un archivo y lo decodifica en un objeto!

Me parece como que debería usar una base de datos que manejar todo el almacenamiento en caché, etc. Por otra parte, parece que debería ser capaz de saltarse el paso de archivos / base de datos y pasar el Data a la DataWidget en el programa (tal vez pasarlo una referencia a una lista de Data). Sin embargo, también quiero salvar el Data a presentar en el fichero / base de datos de paso no es del todo inútil -. Sólo estoy usando en el camino equivocado en el momento equivocado

¿Cuál es el mejor enfoque dado a mis necesidades?

¿Hay recursos generales y / o directrices para el manejo y la visualización de datos como este?

¿Fue útil?

Solución

Veo que estás usando Qt. Esto es bueno porque Qt 4.0 y posterior incluye un potente marco del modelo / vista. Y creo que esto es lo que desea.

Modelo / Vista

Básicamente, tener su clase herede Data e implementar QAbstractItemModel, o una clase Qt modelo diferente, dependiendo del tipo de modelo que desee. A continuación, fijar su vista del widget (muy probablemente un QListView) para utilizar Data por su modelo.

Hay un montón de ejemplos en su sitio y esta solución escalas muy bien con grandes conjuntos de datos.

Alta: Este código de prueba del modelo labs.trolltech.com viene en realidad es práctico:

http://labs.trolltech.com/page/Projects/Itemview/Modeltest

Otros consejos

  

Me parece como que debería usar   una base de datos que manejar todo el   el almacenamiento en caché, etc. Por otra parte, parece como si   debe ser capaz de saltar el   archivo / paso base de datos y pasar los datos   a la DataWidget en el programa   (Tal vez pasarla una referencia a una lista   de datos). Sin embargo, también quiero guardar el   Los datos de archivo en el paso fichero / base de datos   no es del todo inútil - Soy sólo   usarlo de la manera incorrecta en el mal   tiempo.

Si se necesita mostrar que gran parte de datos que cambia rápidamente, tener un archivo intermedio o base de datos va a reducir la velocidad y probablemente se convertirá en el cuello de botella. Creo que el Widget debe leer los datos recién generados directamente desde la memoria. Esto no le impide almacenar los datos en un archivo o base de datos, sin embargo, se puede hacer en un tema / proceso separado.

Si todos los elementos de datos cabe en la memoria, yo diría que los puso en un vector / lista y pasa una referencia a que a la DataWidget. Cuando es el momento de guardarlos, pasar una referencia a su método de serialización. Entonces el experimento simplemente rellena la estructura de datos para los otros procesos para su uso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top