Konsturktionsproblem bei QAbstractItemModel u. QTreeView
-
Hallo zusammen! :-)
Ich hab eine kleine Frage zur Konstruktion von QAbstractItemModels. Ich hab mich versucht sehr nahe am editabletreemodel example zu orientieren.
Folgendes habe ich von der Klassenstruktur:
QAbstractItemModel
|_NetworkDataModelQObject
|_NetworkDataModelItem
|_NetzwerkQObject
|_NetworkDataModelItem
|_NetzwerkknotenQObject
|_NetworkDataModelItem
|_NetzwerkEndpunktSo könnte die dargestellte Liste aussehen in der QTreeview:
Root
|_Netzwerk 1
|_Netzwerkknoten 1
|_NetzwerkEndpunkt1
|_NetzwerkEndpunkt2
|_Netwerkknoten 2
|_NetzwerkEndpunkt1
|_NetzwerkEndpunkt2
|NetzwerkEndpunkt3
|NetzwerkEndpunkt4
| Netzwerk 2
| nSo der Plan war das jede Klasse für sich das Netzwerkakualisiert und NICHT das Model das füllen übernimmt. Ich hoffe das verständlich was ich meine. ;-) In dem Qt Example ist es ja so, dass ich eine neue Zeite einfüge in dem ich im Model sage mach mal in der Reihe ein neues Item. Möchte ich aber nicht. Das soll das jeweilige Item selber tun und dem Model sagen, dass sich was geändert hat.
Folgende Probleme habe ich. Angenommen ich sagte Netzwerkknoten 1 "such mal alle deine NetzwerkEndpunkte". Macht er soweit und aktualisiert seine Itemliste. So wie sage ich jetzt dem Model bescheid, dass sich von Netzwerkknoten 1 die Itemliste verändert hat? Ich scheiter momentan immer am QModelIndex.
So jetzt etwas anspruchsvoller. Ich verändere den Parent von Netzwerkknoten 2 und verändere diesen von Netzwerk 1 zu Netzwerk 2.. Des Sinn sein hier mal egal. Denn wie sage ich hier, dass sich was verändert hat?
[code]
bool NetworkDataModelItem::setParent(NetworkDataModelItem *parent)
{
//Remove the item from the old list
if(m_parentItem)
m_parentItem->m_childItems.removeAt(childNumber());bool ret = false; if(parent->insertChild(this)) { emit parentChanged(); ret = true; } return ret;
}
[/code]Würde mich tierisch freuen, wenn ihr mir auf die Sprünge helft! :-)
-
[quote author="Psychomax" date="1337894610"]
So der Plan war das jede Klasse für sich das Netzwerkakualisiert und NICHT das Model das füllen übernimmt. Ich hoffe das verständlich was ich meine. ;-) In dem Qt Example ist es ja so, dass ich eine neue Zeite einfüge in dem ich im Model sage mach mal in der Reihe ein neues Item. Möchte ich aber nicht. Das soll das jeweilige Item selber tun und dem Model sagen, dass sich was geändert hat.
[/quote]
Ich glaube das wird so nicht funktionieren, da die TreeView nur mit ihrem Model kommuniziert, nicht mit den TreeItems (NetworkDatModelItem).
Wenn die Items das selbst machen sollen, könntest du überlegen ein QTreeWidget statt QTreeView zu benutzen (und deine Items von QTreeWidgetItem ableiten), aber damit geht dir eben auch ne Menge flexibilität verloren...
Ich mache das gern so, dass meine TreeItems ein Signal senden, mit dem sich das Model verbindet und das Update für ein bestimmtes Item (parameter im Signal) vornimmt... Dann "sagen" die Items dem Model dass sich was geändert hat, genau wie du es willst. Nur muss anschließend eben noch das Model der View mitteilen dass sich was geändert hat (emit dataChanged()) -
[quote author="Mr.Universe" date="1343125225"]
Ich mache das gern so, dass meine TreeItems ein Signal senden, mit dem sich das Model verbindet und das Update für ein bestimmtes Item (parameter im Signal) vornimmt... Dann "sagen" die Items dem Model dass sich was geändert hat, genau wie du es willst. Nur muss anschließend eben noch das Model der View mitteilen dass sich was geändert hat (emit dataChanged())
[/quote]Das geht aber nur, wenn du kein TreeWidget verwendest :-)
Um eine Verbindung von den items zum Model kommt man auf keinen Fall rum.
Und mir stellt sich auch die Frage, ob man reine Daten Containern nicht dumm halten sollte und diese Logik in andere Klassen auslagert (wäre mein Favor). -
[quote author="Gerolf" date="1343201516"]
Das geht aber nur, wenn du kein TreeWidget verwendest :-)
[/quote]So meinte ich das doch :D
also entweder signals oder treewidget, nicht beides... -
[quote author="Mr.Universe" date="1343215845"][quote author="Gerolf" date="1343201516"]
Das geht aber nur, wenn du kein TreeWidget verwendest :-)
[/quote]So meinte ich das doch :D
also entweder signals oder treewidget, nicht beides...[/quote]
Sorry, war im zusammenhang etwas verwirrt, deswegen wollte ich das nur nochmal klar so hinschreiben :-)