MVC Beispiel gesucht für SQL - GraphicsScene

Alles rund um die Programmierung mit Qt
Antworten
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

MVC Beispiel gesucht für SQL - GraphicsScene

Beitrag von otternase »

Hallo

ich suche nach einem Beispiel oder Tipps, wie man folgende Aufgabe lösen könnte:

In einer Tabelle (oder einem View) einer Datenbank stehen Einträge, die jeweils ein Item repäsentieren. Die Position, die dieses Item in einer GrahicsScene einnehmen soll, steht in zwei Spalten X und Y (ggf. auch noch ein alpha für Drehung).

Nun soll die Scene automatisch aus dieser Tabelle erstellt werden, ändert sich die Datenbank (neue Zeile=neues Item oder veränderte X, Y Position), soll entsprechend sich auch die Scene ändern; umgekehrt soll eine Änderung in der Scene (zB. Nutzer verschiebt ein Item) in die Tabelle weitergeleitet werden.

Das klingt meiner Meinung nach sehr stark nach einem MVC-Ansatz mit einem SQL-Model und der GraphicsScene als View und Controller.

Gibt es für diese Aufgabenstellung irgendwo geeignete Beispiele, hat jemand schon mal ein SQL-Model mit einer GrahicsScene verheiratet?

Für Tipps und Hinweise wäre ich dankbar!
Markus
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Im Anhang ein Beispiel, wie man es machen könnte.
Dateianhänge
src.tar.gz
(2.06 KiB) 168-mal heruntergeladen
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

Beitrag von otternase »

--- jetzt ist der Anhang da ---
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

Beitrag von otternase »

Hallo

erstmal vielen Dank fuer das Beispiel, das hat schon sehr geholfen. Für den Fall im Beispiel, in dem die Tabelle din Inhalt vom Model ändert und das dann an an den GrahicsView weitergeleitet wird, klappt das auch hervorragend.

Aber da taucht das nächste Problem auf:

bei mir soll der View ja einer Tabelle der Datenbank folgen. Dabei kann es sein (oder ist sogar der Regelfall), dass sich Daten in der Tabelle von extern bewirkt ändern...

Wenn ich nun einfach ein QSqlQueryModel nehme, so folgt das Model nicht der Datenbank, sondern zeigt stur den Zustand bei Ausführen der Query an.

Wie kann man Datenbank und Query so verheiraten, dass bei einem Update der Daten in der Datenbank die entsprechenden Zeilen im Model aktualisiert werden?

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

Beitrag von upsala »

Postgres/Firebird verwenden. Listen/Notify verwenden.
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

Beitrag von otternase »

ja, ich benutze PostgreSQL

die Idee mit Notify und QSqlDriver::subscribeToNotification ( const QString & name ) hatte ich auch, aber irgendwie ist mir nicht ganz klar, wie das laufen soll...

das erste Problem ist das Auslösen des NOTIFY durch den VIEW. Bei VIEWs gibt es meines Wissens nach keine Triggerfunktionen, oder irre ich mich da?

das zweite Problem ist, was ich bei Empfang des Signals mache. Ich will nicht das Model dann resetten und die Query neu ausführen. Das hiesse ja dann für den angeschlossenen GraphicsView ein komplettes Neuzeichnen und das kann kaum sinnvoll sein. Es sollte vielmehr nur die eine veränderte Zeile updated werden! Wie aber teile ich dem Model mit, dass nur ein Item geändert werden soll und wie teile ich dem Model mit, welches Item neu eingelesen werden soll? NOTIFY kann zwar neben dem Namen noch payload mitgegeben werden, man könnte da also zB. den Key mit reinschreiben, aber Qt scheint gemäß der Beschreibung void QSqlDriver::notification ( const QString & name ) [signal] kein payload einzulesen???
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ob du ein Notify machst hängt nicht von der View ab, sondern vom Insert/Update/Delete und an die kann man einen Trigger/eine Rule anbinden.

In deiner Tabelle würde ich an jede Row einen timestamp anhängen, die bei Änderung mit angepasst wird.

Außerdem würde ich würde ein eigenes Model schreiben und dieses mit einer eigenen QSqlQuery updaten.
otternase
Beiträge: 62
Registriert: 25. Januar 2008 12:20

Beitrag von otternase »

Ich will versuchen, das durch etwas nähere Erklärung zu verdeutlichen:

in meiner Datenbank gibt es verschiedene Tabellen, in denen items verschiedenen Typs gespeichert sind. Gemeinsam haben sie aber alle eine Information id,x,y,rot,color (id ist global unique, da durch Sequenz erzeugt)
In meinem Qt Programm werden die auf einer Grafik dargestellt als Punkte eben mit x,y,rotation, color
Welche Punkte angezeigt werden sollen, wird durch extern bestimmt (anderer Client oder TRIGGER-Funktion, die ein REPLACE VIEW auslöst) Der VIEW ist damit einmal zB. ein SELECT id,x,y,rot,color FROM TabA UNION ALL SELECT id,x,y,rot,color FROM TabB , ein anderes Mal ein SELECT id,x,y,rot,color FROM TabC WHERE x<10 UNION ALL SELECT id,x,y,rot,color FROM TabD WHERE attributY=true oder was auch immer.
Natürlich ist ein Neuzeichnen der Grafik nötig, wenn die Definition des VIEW sich ändert. Aber eben auch, wenn sich eine Zeile im VIEW ändert, weil sich die Daten in der dazugehörigen Tabelle geändert haben.
Das Notify soll daher nicht von allen Tabellen kommen ungeachtet dessen, ob die Tabelle überhaupt dem VIEW momentan zugrundeliegt, soll auch nicht für jedes Objekt kommen, sondern nur für die items, die momentan im View angezeigt werden...
Und damit nicht ständig ALLES neu gezeichnet werden muss, möchte ich auch wissen, welche Zeile sich geändert hat und NUR diesen Eintrag im Model ändern...
hal2010
Beiträge: 2
Registriert: 6. Juni 2010 23:41

Beitrag von hal2010 »

Hallo zusammen,

da ich gerade eine ähnliche Anwendung erstelle, wäre es möglich, auch mir das MVC-Beispiel zukommen zu lassen?

Hm, sehe gerade, dass der Anhang jetzt herunterladbar ist. Hat sich also erledigt :)
Antworten