Model/View-Arch. -> Fragen

Alles rund um die Programmierung mit Qt
Antworten
Saiyaman
Beiträge: 111
Registriert: 20. Mai 2005 13:52

Model/View-Arch. -> Fragen

Beitrag von Saiyaman »

Meine Fragen beziehen sich auf ein QTreeView.

Ich habe quasi folgenden Aufbau:

(DATA) - (CTreeItem) - (CTreeModel) - (QTreeView)

...und halt das CTreeDelegate, welches es mir ermöglicht, "interaktiv" (DATA) zu ändern.

1. Was ist nun aber, wenn ich von außen die (DATA) ändere, wie teile ich dies dem CTreeModel mit? Ein direkter Aufruf einer Methode in meinem CTreeModel?

2. Wenn ich von außen im Model etwas ändern möchte, wie sollte das geschehen?

Wenn ich über QTreeView->model() gehe, komme ich ja nicht an eigene Methoden aus CTreeModel ran, sondern nur an die, welche es schon im QAbstractItemModel gibt - richtig? Also müsste ich mir das Model meines Views merken:

Code: Alles auswählen

CTreeModel * model = new CTreeModel(...);
QTreeView * view = new QTreeView(...);
view->setModel(model);
model->customMethod(...);
3. An die momentan ausgewählten Daten komme ich ja mittels QTreeView->currentIndex() ran. Ist das die eleganteste Methode?

Code: Alles auswählen

CTreeItem * item = static_cast<CTreeItem*>(view->currentIndex().internalPointer());
MfG
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Um an den 'richtiges' Model zu kommen könntest du ja auch casten. Ansonsten Daten kann man über setData des Models ändern. Die Items würde ich nicht direkt ändern.
Saiyaman
Beiträge: 111
Registriert: 20. Mai 2005 13:52

Beitrag von Saiyaman »

CTreeItem fasse ich nicht an.

Es muss schon möglich sein, die Daten auch anderweitig zu ändern. Nur über setData vom CTreeModel wäre das viel zu umständlich, weil die Datenstruktur ja eben schon vorhanden ist.

SetData nehme ich nur für einige Editiermöglichkeiten, die das Delegate bereithält (was ich momentan auch noch nicht soo dringend benötige).

Im Model selbst müsse ich ja nur Reihen entfernen oder hinzufügen :)

MfG
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Klar, du castet das Model, das von den Views geliefert wird auf dein eigenes Model und kannst dort dann deine eigenen Funktionen aufrufen.
Saiyaman
Beiträge: 111
Registriert: 20. Mai 2005 13:52

Beitrag von Saiyaman »

Zu dem kommt noch, wenn ich die DATA extern ändere, dann nur über ausgewählten Eintrag im QTreeView. Demnach hätte ich dann einen Index, den ich an das Model weitergeben könnte.

Prima, dann passt ja alles.

MfG
-Marco-
Beiträge: 47
Registriert: 4. April 2006 16:35

Beitrag von -Marco- »

nur so am Rande, anstatt static_cast solltest du lieber qobject_cast verwenden.
Gruß Marco
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Nen upcast deutet meist auf ne designschwaeche hin ....

Eigentlich sollte dein CTreeModel ne implementation von QAbstractItemModel sein .... und nen "Verweis" auf deine Daten haben ....

wenn sich von aussen deine daten aendern, muss es das CTreeModel mitbekommen. Du kannst im Model dann ueber aufruf der passenden funktionen Deinen views mitteilen, das zeug geandert werden muss. die views holen sich die daten dann neu ...

So die Theorie ....

wie dein CtreeModel die aenderung mitbekommt ist deine verantwortung.
- regelmaessiges checken auf updates ueber timer ist gar ned mal so unueblich.
- oder der der die daten aendert, signalisiert das auch dem model ....

ciao ....
Antworten