wxWidgets, wxFormbuilder, Events und übergeordnete Objekte



  • Hallo zusammen.
    Ich habe eine Frage die mehr die richtige "Strategie" betrifft, und weniger die konkrete Umsetzung.
    Ich bin recht neu bei C++, aber die Grundlagen habe ich wohl verstanden.

    Ich nutze wxWidgets für die GUI. Als weiteres Tool nutze ich den wxFormbuilder.

    Ziel ist verschiedene Klassen zu schreiben, die dann eine Abfolge von Funktionen aus OpenCV umsetzen. Die nenne ich im Folgenden Text Filter. Das ist soweit kein Problem.

    Um die Parameter der Filter OnTheFly ändern zu können, soll bei jeder Objekterzeugung (Filter) auch eine wxDialog erzeugt werden, in welchem dann die Parameter angezeigt/geändert werden können.
    Es wird also in wxFormbuilder je ein Dialog pro Klasse gebastelt, mit den Eingabemöglichkeiten, welche für den jeweiligen Filter nötig ist.

    Auch das ist kein Problem.

    Jetzt kann es aber auch mehrere gleiche Filterobjekte einer solchen Klasse geben, was ebenfalls zu mehreren Objekten der wxDialoge führt. Und dann wird es schwierig. Ich würde gerne die vom wxFormbuilder erzeugten Dateien lassen wie sie sind, damit ich nicht bei jeder Änderung alles wieder ändern muss.
    Also arbeite ich da mit den abgeleiteten Klassen.

    Jetzt kommt das Problem. Ein gedrückter Button löst ein Event aus, und ich lande in der entsprechenden Funktion. Diese ist aber immer gleich, weil das Dialogfenster, die Buttons und die Events für jeden Filter erzeugt werden, und die Events somit für verschieden Dialoge gleich sind.
    Wie stelle ich fest für welches Objekt der Button gedrückt wurde? Alle erzeugten Dialoge rufen die gleiche Funktion auf.
    Die Objekte der wxDialoge sind Member der zugehörigen Klasse, deren Eigenschaften sie verändern soll. Ich kann zwar wissen von welchem Dialogobjekt die Funktion aufgerufen wurde, aber eigentlich brauche ich das Filter-Objekt.

    Mir fallen einige Möglichkeiten ein das Problem zu lösen, aber alle haben irgendwelche Harken. So könnte ich z.B. dem erzeugten Dialogobjekt über den Konstruktor immer die Referenz auf das Filter-Objekt mitgeben, in welchem das Dialogobjekt erzeugt wird. Dann könnte ich in den Events mit der Referenz arbeiten und lande dort (Funktionen/Member) wo ich hinmöchte. Leider muss ich dafür die wxFormbuilder-Datei anpassen. Und ich bin gar nicht sicher ob es so klug ist das Dialog-Objekt in dem Objekt zu erzeugen welches beeinflusst werden soll. Es ist aber eigentlich die bequemste Möglichkeit.

    Wie löst man das sinnvoll?



  • @Sleepwalker70 Wenn du unterschiedliches Verhalten haben willst, macht es eventuell Sinn, unterschiedliche Event Handler zu verwenden und mit Bind() an den entsprechenden Button zu binden.

    Wenn du trotzdem dringend wissen musst/willst wer das Event erzeugt hat, du kannst in wxWidgets jedem Control einen ID mitgeben, die dann den Events mitgegeben wird.
    Wenn die ID nicht -1 (wxID_ANY) ist, dann muss die eindeutig sein und außerhalb des ID Bereichs welches von wxWidgets selbst verwendet wird sein.


Log in to reply