Réponse courte
Le MVC de Qt ne s'applique qu'à une seule structure de données . Lorsque vous parlez d'une application MVC , vous ne devez pas penser à QAbstractItemModel
ou QListView
.
Si vous voulez une architecture MVC pour tout votre programme, Qt n'a pas un tel framework de modèle / vue "énorme". Mais pour chaque liste / arbre de données de votre programme, vous pouvez utiliser l'approche Qt MVC qui a en effet un contrôleur dans sa vue. Les données se trouvent à l'intérieur ou à l'extérieur du modèle; cela dépend du type de modèle que vous utilisez (propre sous-classe de modèle: probablement dans le modèle; par exemple QSqlTableModel: à l'extérieur (mais peut-être mis en cache dans) le modèle). Pour assembler vos modèles et vos vues, utilisez vos propres classes qui implémentent ensuite la logique métier .
Longue réponse
Approche modèle / vue et terminologie de Qt:
Qt fournit des vues simples pour leurs modèles. Ils ont un contrôleur intégré: la sélection, l'édition et le déplacement des éléments sont ce que, dans la plupart des cas, un contrôleur "contrôle". C'est-à-dire interpréter les entrées de l'utilisateur (clics et mouvements de la souris) et donner les commandes appropriées au modèle.
Les modèles de Qt sont en effet des modèles ayant des données sous-jacentes. Les modèles abstraits ne contiennent bien sûr pas de données, car Qt ne sait pas comment vous voulez les stocker. Mais vous étendez un QAbstractItemModel à vos besoins en ajoutant vos conteneurs de données à la sous-classe et en créant l'interface du modèle pour accéder à vos données. Donc en fait, et je suppose que vous n'aimez pas cela, le problème est que vous devez programmer le modèle, donc comment les données sont accessibles et modifiées dans votre structure de données.
Dans la terminologie MVC, le modèle contient à la fois les données et la logique . Dans Qt, c'est à vous de décider si vous incluez ou non une partie de votre logique métier à l'intérieur de votre modèle ou si vous la mettez à l'extérieur, étant une «vue» en soi. Ce que l'on entend par logique n'est même pas clair: sélectionner, renommer et déplacer des éléments? => déjà implémenté. Faire des calculs avec eux? => Mettez-le à l'extérieur ou à l'intérieur de la sous-classe de modèle. Stocker ou charger des données depuis / vers un fichier? => Mettez-le dans la sous-classe du modèle.
Mon avis personnel:
Il est très difficile de fournir un bon et système MV (C) générique pour un programmeur. Parce que dans la plupart des cas les modèles sont simples (par exemple uniquement des listes de chaînes), Qt fournit également un QStringListModel prêt à l'emploi. Mais si vos données sont plus complexes que des chaînes, c'est à vous de décider comment vous voulez les représenter via l'interface modèle / vue Qt. Si vous avez, par exemple, une structure avec 3 champs (disons des personnes avec nom, âge et sexe), vous pouvez attribuer les 3 champs à 3 colonnes différentes ou à 3 rôles différents. Je n'aime pas les deux approches.
Je pense que le cadre modèle / vue de Qt n'est utile que lorsque vous souhaitez afficher des structures de données simples . Cela devient difficile à gérer si les données sont de types personnalisés ou ne sont pas structurées dans un arbre ou une liste (par exemple un graphique). Dans la plupart des cas, les listes suffisent et même dans certains cas, un modèle ne doit contenir qu'une seule entrée. Surtout si vous souhaitez modéliser une seule entrée ayant différents attributs (une instance d'une classe), le cadre modèle / vue de Qt n'est pas la bonne façon de séparer la logique de l'interface utilisateur.
Pour résumer, je pense que le cadre modèle / vue de Qt est utile si et seulement si vos données sont visualisées par l'un des widgets de visualisation de Qt . C'est totalement inutile si vous êtes sur le point d'écrire votre propre visualiseur pour un modèle ne contenant qu'une seule entrée, par exemple les paramètres de votre application, ou si vos données ne sont pas de types imprimables.
Comment utiliser le modèle / la vue Qt dans une (plus grande) application?
J'ai écrit une fois (en équipe) une application qui utilise plusieurs modèles Qt pour gérer les données. Nous avons décidé de créer un DataRole
pour contenir les données réelles qui étaient d'un type personnalisé différent pour chaque sous-classe de modèle différente. Nous avons créé une classe de modèle externe appelée Model
contenant tous les différents modèles Qt. Nous avons également créé une classe de vue externe appelée View
contenant les fenêtres (widgets) qui sont connectées aux modèles à l'intérieur Model
. Cette approche est donc un Qt MVC étendu, adapté à nos propres besoins. Les deux Model
et View
classes elles - mêmes n'ont rien à voir avec le MVC Qt.
Où avons-nous mis la logique ? Nous avons créé des classes qui ont effectué les calculs réels sur les données en lisant les données des modèles source (lorsqu'ils ont changé) et en écrivant les résultats dans les modèles cibles. Du point de vue de Qt, ces classes logiques seraient des vues, puisqu'elles "se connectent" à des modèles (pas une "vue" pour l'utilisateur, mais une "vue" pour la partie logique métier de l'application).
Où sont les contrôleurs ? Dans la terminologie MVC originale, les contrôleurs interprètent l'entrée utilisateur (souris et clavier) et donnent des commandes au modèle pour exécuter l'action demandée. Étant donné que les vues Qt interprètent déjà les entrées utilisateur telles que le changement de nom et le déplacement d'éléments, cela n'était pas nécessaire. Mais ce dont nous avions besoin, c'était une interprétation de l'interaction utilisateur qui va au-delà des vues Qt.