2009-08-03 4 views
1

Ich mache etwas Refactoring. Ich implementiere ein Model-View-Controller-Muster. Die Ansicht ist ein Qt-Widget.MVC mit Qt-Widget, das eine QAbstractTableModel-Unterklasse verwendet

Ursprünglich erstellte das Qt-Widget eine neue Instanz einer QAbstractTableModel-Unterklasse auf dem Heap. Lass es FooTableModel nennen.

beispiel

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

Soll ich stattdessen die neue Instanz von FooTableModel im MVC-Modell erstellen?

Hierdurch ich eine Abhängigkeit von der Ansicht erstellen könnte (vorausgesetzt, ich immer noch die Zeiger des Widgets passieren an den FooTableModel Konstruktor)

Alternativ ich nichts zu dem FooTableModel Konstruktor übergeben könnte und manuell die FooTableModel löschen in meinem MVC-Modell. *

Die letzte Option wäre, die Erstellung des FooTableModel im Widget zu belassen. (Und lassen Sie das Widget direkt mit dem FooTableModel umgehen?)

Irgendwelche Vorschläge oder Vorlieben?

Meine Vermutung ist, mit * im Moment zu gehen.

Antwort

2

Im Allgemeinen möchten Sie vermeiden, die Ansicht an das Modell zu übergeben.

Wenn Ihr MVC-Modell ein QObject ist und die FooTableModel-Instanz ein Kind davon ist, müssen Sie sich keine Gedanken über die Bereinigung machen, da Qt dies für Sie erledigt. Idealerweise wäre das FooTableModel, wenn Sie Qt verwenden, DAS Modell, oder was auch immer es sein würde.

Qt folgt dem Model/View-Muster, da die Controller-Arbeit von der Ansicht verarbeitet wird. Check out: http://doc.trolltech.com/4.5/model-view-introduction.html für mehr.

Kurze Antwort: Übergeben Sie nichts an FooTableModel, löschen Sie es, wenn Sie fertig sind.

+0

Danke für den Vorschlag. :) Mein MVC-Modell ist kein QObject, daher mache ich die Bereinigung in seinem Destruktor. Mein MVC-Modell verarbeitet die Daten für das gesamte Widget, wobei das FooTableModel für eine QTableView verwendet wird, die auf dem Widget gezeichnet wird. Ich werde wahrscheinlich im Moment dabei bleiben. "Wenn Sie Qt verwenden, wäre das FooTableModel DAS Modell". Meinst du, ich sollte ein Qt-Modell als Modell für das gesamte Widget verwenden? (Anstatt meine eigene zu rollen) Ich bin mir nicht sicher, wie ich das machen würde. Normalerweise verbinde ich ein Qt-Modell mit der zugehörigen Ansicht. –

+0

Entschuldigung für die große Verzögerung. Ja, idealerweise würden Sie eine QAbstractItemModel-Klasse als Modell für das gesamte Widget verwenden. Wenn Ihr gesamtes Modell einen Verweis auf ein QAbstractItemModel und einige andere Eigenschaften speichert, könnten Sie die Klasse von diesem Modelltyp erben lassen und die Eigenschaften ebenfalls speichern. Dies würde mehr Optionen im Model/View-Framework ermöglichen. –

Verwandte Themen