Qt4: Model/Proxy/View -> Syncronisationsproblem

Alles rund um die Programmierung mit Qt
Antworten
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Qt4: Model/Proxy/View -> Syncronisationsproblem

Beitrag von nando »

Hi,

ich habe folgendes Problem:
mit dem Qt Model/View framework lade ich in ein hauptmodel (MODEL) daten.

diese aenderungen gehen an 1 PROXY model, das entscheidet, ob die aenderungen fuer eine VIEW sind oder nicht. funktioniert prima...

jetzt moechte ich zur laufzeit einen 2. PROXY mit einer anderen View dazuschalten...
wie kann ich dem haupt MODEL dann sagen, dass es jetzt einen neuen proxy gibt (PROXY 2) , der die aktuellen daten benoetigt. also eine art refresh triggern, so dass danach beide proxies mit dem hauptmodell synchronisiert sind...?

gibt es da was von Qt?

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

Beitrag von upsala »

Ich verstehe dein Problem nicht.
Denn die Proxys sind ja auch nur Models.
Und einen Proxy hast du ja schon angebunden, also funktioniert der 2. genauso.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Dein verstaendniss fuer das MVC ist etwas falsch.

Das Modell muss/darf ueberhaupt ned auf ein View synchronisiert werden ...

Das bedeutet in der Praxis:
du erzeugst einen view
du stellst fuer das modell den view ein.
In dem Moment fragt der view das Modell (eigentlich den Controller) nach all seinen Daten ab.
er beginnt sich Zeilen spaltenueberschriften zu holen, Anzahl der Zeilen und Spalten abzufragen, und letztendlich sich die daten fuer jede "Zelle" / "Item" zu holen.

wenn er fertig ist, ist der view nun erstmal aktuell.
Aendert sich an deinem modell was, informiert das model den view (eigentlich den controller) drueber, und das view holt sich die daten neu, verwirft komplette Items/zeilen/Spalten ... etc ...

Nen Proxymodell macht nichts anderes, als daten rauszufiltern / umzusortieren ... und bei aenderungen entscheiden, obs das fuer die "das eigene modell" relevant war, und reicht die aenderungen gegebenfalls modifiziert weiter.

Also wenn du aenderungen in deinem Modell ordentlich bekanntgibst
beginInsertXXX und beginRemoveXXX Methoden(protected) intern aufrufen, und datachanged Signal werfen wenn sich einfach daten geaendert haben ....

Ciao ...
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag von nando »

Moin,

danke fuer eure antworten... das mit dem mvc is mir schon klar.

ok, ich hole mal etwas weiter aus.

meine anwendung hat verschiedene "rollen" die ueber ein stacked widget geschaltet werden. jeder rolle hat mehrere views die an jeweil ein proxy connected sind. jeder dieser proxies filter fuer seine connectete view...

nun hab ich scheinbar ein performance problem wenn mein modell sehr viele daten bekommt, weil dann immer alle views (auch die, in rollen, die momentan gar nicht angezeigt werden) ueber ihre filter zeitintensiv aktuallisiert werden,

jetzt habe ich einen neuen ansatz, der zusaetzlich fuer jede "rolle" einen proxy schaltet, der nur daten durchlaesst, die fuer die aktuelle rolle sind...

also angenommen ich habe Rolle A,B,C (und jede dieser rollen hat intern 5 proxies und views) und ich schalte von Rolle A->B, dann sollen nur die proxies der Rolle B arbeiten, A und C wuerden gar keine daten bekommen, weil sie eh nicht angezeigt werden... Nur da B ja keine daten hat (da beim start nur A geladen wurde) muss B sich jetzt alle daten vom model holen (synchronisieren)... diese "alle aktuellen daten holen" muss nach jedem rollen wechsel stattfinden.. und genau da weiss ich nicht genau, wie man das am besten macht....

ich hoffe das war jetzt nicht zu verwirrend...

gruss,
nando
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Nochmal:

Die Daten werden vom View/Proxy geholt, wenn du ihm die source einstellst .... das zu untergraben waer ne verletzung des MVC designs, du wuerdest immer wieder auf probleme stossen.

Du hasst also quasi inaktive proxies .... wenn du nicht willst, das die sich intern aktualisieren und damit Last erzeugen, setzt deren source auf NULL !
stellst du dann wieder eine source ein, holt sich der proxy die daten komplett neu (er macht soweiso nen reset dann) ....

Du kannst auch nen Proxy dazu bringen, das sich die alle nachgeschalteten elemente (also meistens der view) neu synchronisieren, in dem in deinem Proxy einfach nen reset aufrufst, dann schickt der proxy das signal an den view, der verwirft daraufhin seine daten, und holt sich die daten neu vom proxie, der proxie wiederum holt die daten von seiner source und filtert/bearbeitet/verwirft die ... je nach funktion.

Baust du einen Proxie, der sich selber inaktiv schaltet, funktioniert das genau so ... inaktiv schalten, er ignoriert alle events von der source ....
(eigentlich keine gute loesung, da dein proxy in dem moment kein wirklicher proxy mehr ist) ... schaltest du ihn nun wieder aktiv, muessen alle daten neu geholt werden. also den view informieren das er sich komplett neu aufbauen soll -> reset() am proxy aufrufen !
nun hab ich scheinbar ein performance problem wenn mein modell sehr viele daten bekommt,
dieses Problem hat man oefters .... es macht auch dann meist kein sinn, den view so schnell zu aktualisieren, das er jede aenderung mitbekommt. das menschliche auge wuerde eh nix erkennen. Meist fuehrt man dann update intervalle ein.
Und auch hier wieder ! die update intervalle haben dann nix am View zu suchen, sondern sind eigentlich Problem des Controllers, bei der QT dann Problem des Models (ProxyModel oder Ursprungsmodel je nachdem was man erreichen will). Man implementiert das Model dann so, das es sich nur durch ein signal von aussen (timer) aktualisiert .....

Ich seh Dein Problem auch irgendwie nich ...

Ciao ....
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag von nando »

hi,
also ich habe es jetzt mir reset() im proxy und mit
setSourceModel(0)
und dann neues source model setzten probiert.

bei beiden varianten holt sich der proxy die daten nicht neu vom source modell... hmmm

lediglich layoutChanged wird emitiert und in den views dann aufgerufen....
das bringt aber nix, da die neues daten noch nicht in den views sind so langer der proxy sich nicht die daten neu holt... mit reset() etc ....

gruss,
nando
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Da stimmt irgendwas ned .....

nach dem reset muss vom view definitv
rowcount, columncount, data, headerdata etc aufgerufen werden ...
bei setsorucemodell(NULL) bin ich mir ned sicher, ob der dem view ned anderweitig uebermittelt, das er keine daten hat, also die neuabfrage vom view einfach ned kommt.

der view iss nen standard viewm, also tableview, listview oder treeview ?

Ciao ...
Antworten