2010-05-11 4 views
3

Je suis un programmeur Qt C++ avec un certain intérêt pour Gtk +. Je me demande comment Gtk + a implémenté Model-View-Controller. Dans Qt, ils ont tout bousillé, et ont essentiellement admis eux-mêmes. Je peux essayer d'expliquer les failles dans Qt et pour ceux qui connaissent Gtk + peut-être vous pouvez répondre si Gtk + a les mêmes problèmes ou pire:MVC dans Qt vs Gtk +

L'accès à n'importe quel nœud dans un modèle d'arborescence est basé sur un QModelIndex. Chaque nœud a donc une sorte d'identifiant unique. Cela crée beaucoup de complications. Vous devez créer des méthodes spéciales pour créer un index et pour créer l'index du parent d'un objet QModelIndex. Cela peut être très impliqué. Il est difficile de dire créer deux objets Modèle et en attacher un en tant que nœud dans l'autre modèle. Les objets QModelIndex retournés d'un modèle ne sont pas compatibles l'un avec l'autre.

Je pense que Cocoa a fait un modèle beaucoup plus simple avec NSOutlineView et NSOutlineViewDataSource. L'approche de Qt est plus flexible, mais au prix d'être trop difficile à utiliser et d'obtenir raison. Avec Cocoa, vous n'utilisez pas d'objet index, mais demandez quel est le fils de l'objet X à l'index Y. Et vous pouvez demander la valeur d'une colonne de table Z et d'un objet X.

Qt n'a pas un moyen particulièrement simple d'invalider un noeud dans l'arbre, pour le recharger. Avec Cocoa, vous pouvez appeler reloadItem pour créer un objet particulier dans l'arborescence et éventuellement recharger ses enfants depuis Model.

Cela fait partie de mon évaluation de la pertinence de Gtk +. Je n'essaie pas de déclarer une sorte de gagnant ici ;-)

Répondre

3

En supposant que vous parlez des arbres principalement (GTK + utilise modèle-vue-contrôleur pour d'autres types de données, notamment le texte), l'interface est appelé GtkTreeModel.

Il utilise GtkTreeIter comme "pointeur" de bas niveau dans un modèle.

Je ne pense pas que vous puissiez ajouter un modèle en tant qu'enfant d'un autre, en GTK +.

L'invalidation d'un noeud est aussi simple que l'émission du signal appelé row-changed, mais vous n'avez généralement pas besoin de le faire directement. Pour un arbre simple de types basiques, il suffit de définir une nouvelle valeur dans une cellule pour l'invalider.