Danke, RHBaum, für die Erläuterungen zu Qt. Ja, mir wäre es auch ganz lieb, wenn die Datenschicht nur STL-Funktionen nutzen würde. Aber die Zeit drängt und ich muss irgendwann fertig werden.
Mal zum groben Hintergrund: Es gibt ein fertiges Projekt, dass geometrische Daten auf dem Bildschirm darstellt. Derzeit gibt es da ein angedachtes Schichtenmodell, was aber sehr oft verletzt wird. Daneben gibt es keinerlei Trennung zwischen Daten, Verarbeitung und Anzeige. So werfen die geometrischen Objekte lustig MessageBoxen.
Ziel ist es nun (innerhalb einer endlichen Zeit), das ganze zumindest so umzustellen, dass man ein besseres Schichtenmodell hat, und die Datenhaltung von der Anzeige trennt (was mich einiges an Nerven kostet). Durch die zeitliche Begrenzung kann ich also nicht alles von Grund auf neu programmieren, sondern muss mich einigermaßen an vorhandene Klassen und Strukturen halten.
Obiges Thema entstand eben aufgrund dessen, dass die Objekte, die selektiert (also einen Punkt als ausgewählt markieren, egal wie dieser ausgewählt wurde), die Daten an den Viewer geben müssen, weil der damit auch noch was machen will. Und die bisherige Lösung, einen Pointer auf den Viewer nach unten zu geben, auf den dann jeder zugreifen kann, war nicht so toll.
Da auch in den unteren Schichten bereits (fast) alles von Qt abhängt, habe ich nicht die Zeit, das in STL zu wandeln, auch wenn es möglich wäre. Und weil Signal/Slot so schön ist, nutze ich ja jetzt sogar noch etwas "mehr" Qt als vorher. Dass das Konzept von der Idee schon nicht toll ist, weiß ich.
aber IMHO isses schlimmer wenn die Datenstruktur Details/Zustaende ueber die GUI wissen muss, damit die App funktioniert.
Ja, das ist sicherlich korrekt, wobei man hier natürlich unterscheiden muss, finde ich. Nehmen wir an, ich klicke in einer GUI auf den Knopf "Berechne mir XYZ", dann muss dieses XYZ irgendwie nach unten gegeben werden, damit etwas aus den Daten oder in den Daten berechnet wird. Natürlich hängt nun in dieser Aufforderung der indirekte Hinweis, dass in der GUI der Knopf für XYZ gedrückt ist, aber das hat ja nichts mit der GUI an sich zu tun.
Ich versuche solche Informationen mit dem SelectionHandler weiterzureichen, wobei Du natürlich recht hast, dass ich da nicht konsequent genug bin. Hier habe ich z.B. Zustände wie "Wähle alles in diesem 2D-Rechteck (auf dem Bildschirm) aus", was natürlich von der GUI abhängt. Eine schnell umzusetzende, sauberere Lösung ist mir (und vielen meiner Kollegen) leider auch nicht eingefallen.
So, nun zu franzf ...
Hast du dir auch schon überlegt, wo, wie und wann du die connects zwischen den Ebenen machen willst?
In dem Absatz hast Du mich irgendwo verloren, so tief stecke ich wohl nicht in Qt drin. Auf alle Fälle gibt nun Objekt B ein Signal aus, das landet bei B', das leitet es weiter an B'', das leitet es weiter an B''' und dann ist es glaube ich schon bei A, wenn ich mich nicht verzählt habe.
Wie wäre es wenn du dich da mal einliest?
Zu viel für einmal, aber ich habe mir heute das Buch "Pattern-orientierte Softwarearchitektur" von Buschmann, Meunier, Rohner, Sommerlad und Stal vorgenommen. Darin gibt es ein Kapitel zum Thema MVC. Und ich weiß, dass die Anwendung, die ich überarbeite, dem nicht standhält - und auch nach meiner Überarbeitung noch nicht standhalten wird. (Wobei ich die Kritik aus dem Buch an MVC verstehen kann. Die Frage ist auch, ob eine Document-View-Architektur nicht besser wäre für mein Vorhaben. Natürlich nur aus theoretischer Sicht, ich werde es nicht umsetzen können.)
Das ist aber jetzt komisch. Eigentlich muss doch die GUI wissen was sie visualisieren soll, oder?
Finde ich eigentlich nicht. Der Viewer (nicht die GUI, die weiß eh von nix

) soll zeichnen, nicht mehr und nicht weniger. Ihm soll sogar egal sein, was er zeichnet, er soll es nur darstellen. Dank QGLWidget geht das ja mit "makeCurrent" und dann zeichnet man einfach mal drauf los. Das muss nicht der Viewer selbst machen (wobei er natürlich das Zeichnen über paintGL() anstößt.)
Ich fände es auch aber seltsam, wenn der Viewer z.B. wissen muss, dass es in der darunterliegenden Schicht z.B. drei Objekte gibt, wovon Objekt 1 immer benutzt wird und Objekt 2 nur manchmal und auch dann nur, wenn nicht Objekt 3 eine Rolle spielt. Das sollte dem Viewer egal sein. Er sollte (in meinen Augen) nur seinem direkten Verbündeten/Untergebenem/Nachbarn sagen, dass er doch nun endlich mal was auf den Bildschirm (bzw. die OpenGL-Befehle in ein gerade aktives Fenster) zeichen soll. Dieser Befehl "zeichne jetzt" wird dann von jedem Objekt in der Struktur solange nach unten gegeben, bis es jemand kriegt, der damit was anfangen kann.
Mit welcher Schicht arbeitet am Ende der Benutzer deines Modells? Mit der obersten, oder?
Es gibt verschiedene Viewer/GUIs, also verschiedene Frontends. Der Benutzer arbeitet natürlich nur mit der GUI, mehr sieht er nicht. Und das sollte natürlich auch die oberste Schicht sein.
Das heißt Anfragen über selektierte Punkte oder setzen von Selektionskriterien geschehen in dieser Schnittstelle.
Korrekt.
Was spricht denn gegen ein direktes returnen durch die Ebenen hindurch?
Der Speicheraufwand. Ich muss dann jeden Punkt zwischenspeichern, der selektiert wurde. Außer der SelectionHandler bekommt noch mehr Logik und filtert diese gleich nach bestimmten Kriterien. Aber das würde den Sinn des Handlers dann ja wieder verfremden, finde ich.
Ich gebe (bei meiner heutigen Lösung) den SelectionHandler nun zwar als const-Objekt nach unten, das Nachobengeben der selektieren Punkte geschieht aber direkt per Signal in den jeweiligen Objekten.
Ich werde mir bei Gelegenheit (wenn morgen nicht so tolles Wetter wäre) auch mal das MVC von Qt durchlesen, ob da noch mehr drinsteht als in dem Kapitel, was ich heute durchgelesen habe. Danke auf alle Fälle für den Link.
Viele Grüße
Dee