2011-08-13 15 views
8

Estoy desarrollando una aplicación GUI en Qt.Separación de lógica y UI

Esta es mi primera aplicación GUI y no tengo mucha experiencia y todavía tengo que luchar con algunos aspectos más avanzados de C++ y Qt Framework.

La aplicación es bastante simple, presentando una ventana principal y algunos cuadros de diálogo donde el usuario configura ajustes y presiona un botón, y el programa realiza un cálculo (bastante complejo) dando el resultado en algún lugar de la UI.

Ahora, estoy teniendo un problema. Puse todos mis datos de cálculo (que son estáticos y cargados de recursos) y la lógica en una clase separada. Creo una instancia de esta clase y de las clases de UI. Ahora, ¿el problema es cómo acceder a los miembros de la clase de datos/lógica desde una clase de UI? Supongamos que hay una QStringList sentada en la clase de lógica, y quiero un cierto diálogo para acceder a esta lista y presentarla al usuario, sin hacer ninguna copia de la misma en la memoria.

Entiendo que esta es probablemente una pregunta de C++ muy básica (Qt ni siquiera es relevante), pero bueno, no todo el mundo es un asistente de programación. Gracias por cualquier pista o ayuda!

Respuesta

12

Existen varias formas de hacerlo, por lo que su pregunta es válida.

  1. Su clase de GUI se puede derivar de su clase de lógica. No es el enfoque típico, sino que depende de cómo esté diseñada su aplicación. Una desventaja importante es que la GUI debería permanecer en el mismo hilo que la lógica. A menudo, desea que las clases se ejecuten en varios subprocesos, de modo que el cómputo pesado no congele la GUI.

  2. Su clase de GUI puede contener un puntero a su clase lógica y/o viceversa. También puede ser una referencia por conveniencia si su clase lógica existe antes de la clase GUI y la sobrevive. Luego puede pasar la referencia al constructor de la clase GUI y nunca tiene que probar si un puntero es válido.

  3. Su clase de GUI puede acceder a los miembros de datos a través de getters/setters o directamente, si desea hacerlos públicos o simplemente definir su clase de GUI como clase friend en la clase Logic. Incluso si usa getters, pueden devolver referencias de const, por lo que no se requiere copia. Las clases de Qt como QStringList también tienen su propio mecanismo de conteo de referencias, copiado en escritura que evita las copias.

  4. Su clase de GUI puede emitir señales y la clase Logic puede recibirlas. Ver mecanismo de ranura/señal Qt. Es muy bueno para eventos como el botón "Comenzar computación". Las señales tienen dos ventajas: (a) pueden atravesar hilos, sin embargo, si el receptor no es el lazo principal, se vuelve un poco más complicado; (b) los objetos no tienen que verse entre sí (sin pasar el puntero), puede conectar las señales a las ranuras en cualquier lugar de su programa donde haya visto ambos objetos a la vez.

Normalmente usará una mezcla de 2 y 3: use getters para leer los datos de la clase lógica que se presenta al usuario. Use las señales para provocar acción o manipular datos (el usuario hace una elección, la clase lógica tiene que reaccionar).

+0

¡Su respuesta integral fue muy, muy útil! Ahora entiendo mucho mejor esta separación. ¡Gracias! – vedran

+0

Gracias! ¿Hay algún "mejor uno" de estos? –

+0

Por lo general, sugeriría utilizar Qt señal/sistema de ranura. Sin embargo, la razón es que usaría Qt para la GUI de todos modos. – ypnos

1

Quizás me falta algo aquí, pero simplemente inserte su clase de datos en la clase de UI a través de un setter y exponga el método de la clase de datos como pública. Solo necesita pasar un puntero de su clase de datos para evitar cualquier sobrecarga de sobrecarga.

4

Hay un modelo de programación llamado MVC (Modelo - Vista - Control)

Para los casos simples, simplemente Model - View es suficiente. El modelo representa los datos, y la vista representa la IU.

La clase de modelo expone algunas interfaces set/get data. La clase de modelo generalmente no tiene conocimiento sobre la clase de Vista, pero generalmente puede notificar a la clase de Vista cuando los datos cambian (esto se puede hacer usando la señal/ranura en Qt).

La clase de vista contiene un puntero a la clase Model y utiliza las interfaces que proporciona la clase Model para manipular los datos.

Cuestiones relacionadas