2009-08-03 8 views
1

Je fais un refactoring. J'implémente un modèle Model-View-Controller. La vue est un widget Qt.MVC avec widget Qt qui utilise une sous-classe QAbstractTableModel

À l'origine, le widget Qt créait une nouvelle instance d'une sous-classe QAbstractTableModel sur le tas. Appelons-le FooTableModel.

par exemple

Widget::Widget(QWidget* parent) 
    : 
    QWidget(parent) 
    m_model(new FooTableModel(this)) 
{ 

Dois-je créer une nouvelle instance de FooTableModel dans le modèle MVC à la place?

Ce faisant, je pourrais créer une dépendance à la vue (en supposant que je passe encore le pointeur du widget au constructeur FooTableModel)

Sinon, je ne pouvais passer rien au constructeur FooTableModel et supprimer manuellement le FooTableModel dans mon Modèle MVC. *

La dernière option consisterait à laisser la création du FooTableModel dans le widget. (Et laisser le widget gérer le FooTableModel directement?)

Des suggestions, ou des préférences?

Ma conjecture est d'aller avec * pour le moment.

Répondre

2

Généralement, vous voulez éviter de passer la vue au modèle.

Si votre modèle MVC est un QObject et que l'instance FooTableModel en est un enfant, vous n'avez pas besoin de vous soucier du nettoyage car Qt le fera pour vous. Idéalement, si vous utilisez Qt, le FooTableModel serait le modèle, ou tout ce que l'instance aurait été.

Qt suit le modèle Modèle/Vue puisque le travail du contrôleur est géré par la vue. Découvrez: http://doc.trolltech.com/4.5/model-view-introduction.html pour plus. Réponse courte: Ne passez rien à FooTableModel, supprimez-le lorsque vous avez terminé.

+0

Merci pour la suggestion. :) Mon modèle MVC n'est pas un QObject, donc je vais faire le nettoyage dans son destructeur. Mon modèle MVC gère les données pour l'ensemble du widget, où FooTableModel est utilisé pour un QTableView dessiné sur le widget. Je vais probablement m'en tenir à cela pour le moment. "Si vous utilisez Qt, le FooTableModel sera le modèle". Voulez-vous dire que je devrais utiliser un modèle Qt comme modèle pour l'ensemble du widget? (Au lieu de lancer le mien) Je ne suis pas sûr de savoir comment je ferais cela. Je lie habituellement un modèle Qt avec sa vue associée. –

+0

Désolé pour le grand retard. Oui idéalement, vous utiliseriez une classe QAbstractItemModel comme modèle pour l'ensemble du widget. Si tout votre modèle enregistre une référence à un QAbstractItemModel et à quelques autres propriétés, vous pouvez faire en sorte que la classe hérite de ce type de modèle et stocker les propriétés. Cela permettrait plus d'options dans le cadre Model/View. –