Respuesta corta
MVC de Qt solo se aplica a una estructura de datos . Cuando se habla de una aplicación MVC , no debe pensar en QAbstractItemModel
o QListView
.
Si desea una arquitectura MVC para todo su programa, Qt no tiene un marco de modelo / vista tan "enorme". Pero para cada lista / árbol de datos en su programa, puede usar el enfoque Qt MVC que de hecho tiene un controlador a su vista. Los datos están dentro o fuera del modelo; esto depende del tipo de modelo que esté utilizando (propia subclase de modelo: probablemente dentro del modelo; por ejemplo, QSqlTableModel: fuera (pero quizás almacenado en caché) del modelo). Para unir sus modelos y vistas, use clases propias que luego implementen la lógica empresarial .
Respuesta larga
Enfoque y terminología de modelo / vista de Qt:
Qt proporciona vistas simples para sus modelos. Tienen un controlador integrado: seleccionar, editar y mover elementos es algo que en la mayoría de los casos un controlador "controla". Es decir, interpretar la entrada del usuario (clics y movimientos del mouse) y dar los comandos apropiados al modelo.
Los modelos de Qt son de hecho modelos que tienen datos subyacentes. Los modelos abstractos, por supuesto, no contienen datos, ya que Qt no sabe cómo desea almacenarlos. Pero se extiende una QAbstractItemModel a sus necesidades mediante la adición de sus contenedores de datos a la subclase y haciendo que la interfaz de modelo de acceso a sus datos. Así que, de hecho, y supongo que no lo hace así, el problema es que se necesita programar el modelo, así que ¿cómo se accede y modificados en su estructura de datos de datos.
En la terminología MVC, el modelo contiene tanto los datos como la lógica . En Qt, depende de usted si incluye o no parte de su lógica empresarial dentro de su modelo o la pone fuera, siendo una "vista" por sí misma. Ni siquiera está claro qué se entiende por lógica: ¿seleccionar, cambiar el nombre y mover elementos? => ya implementado. ¿Haciendo cálculos con ellos? => Ponlo fuera o dentro de la subclase del modelo. ¿Almacenar o cargar datos desde / hacia un archivo? => Ponlo dentro de la subclase del modelo.
Mi opinión personal:
Es muy difícil proporcionar un sistema MV (C) bueno y genérico a un programador. Debido a que en la mayoría de los casos los modelos son simples (por ejemplo, solo listas de cadenas), Qt también proporciona un QStringListModel listo para usar. Pero si sus datos son más complejos que las cadenas, depende de usted cómo desea representar los datos a través de la interfaz modelo / vista de Qt. Si tiene, por ejemplo, una estructura con 3 campos (digamos personas con nombre, edad y sexo), podría asignar los 3 campos a 3 columnas diferentes o a 3 roles diferentes. No me gustan ambos enfoques.
Creo que el marco de modelo / vista de Qt solo es útil cuando desea mostrar estructuras de datos simples . Se vuelve difícil de manejar si los datos son de tipos personalizados o no están estructurados en un árbol o lista (por ejemplo, un gráfico). En la mayoría de los casos, las listas son suficientes e incluso en algunos casos, un modelo solo debe contener una sola entrada. Especialmente si desea modelar una sola entrada con diferentes atributos (una instancia de una clase), el marco de modelo / vista de Qt no es la forma correcta de separar la lógica de la interfaz de usuario.
Para resumir, creo que el marco de modelo / vista de Qt es útil si y solo si uno de los widgets de visor de Qt está viendo sus datos . Es totalmente inútil si está a punto de escribir su propio visor para un modelo que contiene solo una entrada, por ejemplo, la configuración de su aplicación, o si sus datos no son de tipo imprimible.
¿Cómo usé el modelo / vista Qt dentro de una aplicación (más grande)?
Una vez escribí (en equipo) una aplicación que usa múltiples modelos Qt para administrar datos. Decidimos crear un DataRole
para contener los datos reales que eran de un tipo personalizado diferente para cada subclase de modelo diferente. Creamos una clase de modelo externa llamada que Model
contiene todos los diferentes modelos de Qt. También creamos una clase de vista externa llamada View
mantener las ventanas (widgets) que están conectadas a los modelos internos Model
. Entonces, este enfoque es un Qt MVC extendido, adaptado a nuestras propias necesidades. Tanto Model
y View
clases mismas no tienen nada que ver con el Qt MVC.
¿Dónde pusimos la lógica ? Creamos clases que realizaban los cálculos reales de los datos leyendo datos de los modelos de origen (cuando cambiaban) y escribiendo los resultados en los modelos de destino. Desde el punto de vista de Qt, estas clases lógicas serían vistas, ya que se "conectan" a modelos (no "vista" para el usuario, sino una "vista" para la parte lógica de negocios de la aplicación).
¿Dónde están los controladores ? En la terminología MVC original, los controladores interpretan la entrada del usuario (mouse y teclado) y dan comandos al modelo para realizar la acción solicitada. Dado que las vistas de Qt ya interpretan la entrada del usuario como cambiar el nombre y mover elementos, esto no era necesario. Pero lo que necesitábamos era una interpretación de la interacción del usuario que fuera más allá de las vistas de Qt.