GUI Programmierung Empfehlung (Windows 7 und Visual Studio)



  • Hallo zusammen.

    Eigentlich erstelle ich meine Applikationen mit GUI immer in .Net mit WPF.
    Hier habe ich eine (saubere) Trennung von Business Code und Code für die GUI.

    Nun musste ( durfte 😃 ) ich eine Bibliothek in c++ (dll) erstellen.
    Die dll stellt Exportfunktionen für eine externe Visualisierung bereit.

    Nun möchte ich gerne ein paar Dinge visualisieren aber in die externe Visualisierung kann/möchte ich nicht eingreifen.

    Die Frage ist wie und mit was erstelle ich nun eine eigene Visualiserung die Informationen aus meinem Code "ausliest" und darstellt.

    Fragen:

    1. Welche Technik. Am liebsten kein MFC. Ist QT (OpenSource) empfehlenswert?
    2. Wie greife ich auf meine Code zu ohne diesen speziell auf die GUI anzupassen?
    Also Daten aus Containern der std lib. Also z.B. set, map, vector.
    Natürlich ganz ohne Anpassung geht es nicht. Aber gibt es hier so was wie DataBinding, PropertyChanged und ObservableCollection wie in WPF?

    3.Kann ich die GUI in eine eigene lib, dll packen damit ich diese GUI Modular halten kann.



  • optimizer schrieb:

    Eigentlich erstelle ich meine Applikationen mit GUI immer in .Net mit WPF.

    Warum willst du das jetzt ändern?



  • Von wollen ist keine Rede. 😃

    Die Bibliothek die ich geschrieben habe musste in c++ sein. Da die externe Software nur auf c++ dll Exportfunktionen zugreifen kann. Kein c#.

    Für diese bestehende Bibliothek muss ich nun eine GUI erstellen. Habe ich aber glaube ich alles in meinem Anfangsthread geschrieben, oder nicht?



  • Ja und? Du mußt die GUI doch deswegen nicht mit C++ umsetzen.
    Verwende COM oder C++/CLI (oder eine C-Schnittstelle und Einbindung mittels P/Invoke) und binde dann dieses Teilprojekt in deine C# (WPF)-Anwendung ein.

    Sicherlich kannst du auch Qt verwenden - auch dieses unterstützt ViewModels und DataBinding (wenn auch etwas anders als in .Net).



  • Ja und? Du mußt die GUI doch deswegen nicht mit C++ umsetzen.
    Verwende COM oder C++/CLI (oder eine C-Schnittstelle und Einbindung mittels P/Invoke) und binde dann dieses Teilprojekt in deine C# (WPF)-Anwendung ein.

    Das wäre natürlich auch möglich. Die Frage ist nur wie aufwendig die ganze Sache ist. Es wird keine große Visualisierung. Ein Datagrid (Tabelle) angebunden an ein std::set deren Objekte sich dynamisch ändern.

    Ich benötige jetzt nicht die volle Funktionalität und Flexibilität von WPF. Ich habe das nur aufgeführt, weil ich sagen wollte das dies eigentlich mein Schwerpunkt ist.

    Die Frage ist wie läuft mein Databinding. Was muss ich dazu in meinen Klassen machen. Muss ich zu jeder Membervariable einen setter und getter rum schreiben dass mir eine Art PropertyChanged wirft. Und aus der std::set eine ObservableCollection machen. Das ist sicher abhängig von der GUI die ich verwende.



  • Ich arbeite viel mit Qt und bin gut damit gefahren, aus einer (C++ Model) DLL Objekte zu holen und referenziert über Objekte von Transferklassen an die Qt-Oberfläche weiter zu leiten (z.B. wegen Standard-Typen <-> Qt-Typen).

    Der Datenaustausch findet in den jeweiligen Transferobjekten statt.

    Wenn eine Modelklasse z.B. ein Attribut „Name“ vom Typ std::string mit und entsprechenden Setter und Getter hat, bekommt die Transferklasse entsprechende Methoden mit den Qt-Typ QString.

    Die Wandlung zum jeweiligen notwendigen Typ wird in den Methoden der Transferklasse vorgenommen.

    Somit ist das Model unabhängig von der gewählten GUI.

    Die Transferklasse sollte ansonsten bei Bedarf (wenn die Objekte aus der Model-DLL über Pointer geleifert werden) wie ein Smartpointer funktionieren.
    .



  • Wenn eine Modelklasse z.B. ein Attribut „Name“ vom Typ std::string mit und entsprechenden Setter und Getter hat, bekommt die Transferklasse entsprechende Methoden mit den Qt-Typ QString.

    Das heißt aber dass ich im Setter des Models dann den Setter meiner Transferklasse aufrufen muss?!



  • Nein, umgekehrt!



  • Nein, umgekehrt!

    auch!

    Aber muss ja in beiden richtungen funktionieren. Wenn ich mein Model aktualisiere - nicht über die View - also irgendjemand fügt einer Collection (list, map, vector was auch immer) einen Wert hinzu muss ich doch meine Transferklasse informieren dass ein neuer Wert hinzugekommen ist.



  • Da gibt es verschiedene Möglichkeiten.

    Bei Änderungen im Model wird ein Model-Controler (eine Klasse im Model, von der ein View-Controler abgeleitet wird) benachrichtigt, der View-Controler wiederum weiß, wen er benachrichtigen muss (zu benachrichtigende View-Objekte melden sich im View-Controler an).

    So habe ich das gebaut; geht aber wahrscheinlich auch anders.

    Du musst überlegen, wie du den Model-Controler über Änderungen der geänderten Model-Objekte benachrichtigst.

    Gruß Helmut


Anmelden zum Antworten