Seite 1 von 1

Trennung von GUI und Logik - Zwei Forms und eine Klasse

Verfasst: 30. Juni 2011 14:11
von rubikon
Moin.

Mal angenommen ich möchte zwei Forms haben. Die zweite ist eine 'abgespeckte' Version der ersten, also mit weniger Widgets. Die dahinterliegende Funktionalität wäre aber die selbe.

Um die GUI von der Logik zu trennen, erstelle ich im Qt Creator als erstes die Logik, in dem ich bei meinem Projekt durch Hinzufügen->C++->C++Klasse einene neue von QWidget abgeleitet Klasse erstelle.

Um die beiden GUIs zu erstellen, wähle ich Hinzufügen->Qt-Designer-Formular (ohne Klasse).

Wie muss ich die drei Sachen jetzt verknüpfen?

Wenn ich jetzt zwei mal Qt-Designer-Formularklasse anstatt Qt-Designer-Formular erstellt hätte, wüsste ich wie ich das Verknüpfen müsste. So hätte ich aber insgesamt drei Klassen. So wie oben beschrieben nur zwei...

Verfasst: 30. Juni 2011 15:12
von -=Freaky=-
ich weiss nicht ob ich dich ganz richtig verstehe, aber
warum von QWidget ableiten, wenn nur "logik" in die klasse soll? waere dann nicht QObject angebracht (bzw. fuer unabhaengigkeit vom framework auch gar keine oberklasse)?

wie ich das verstehe, hast du die "logik" in einem QWidget, und in einem ui-file (oder in 2 oder mehr, wie auch immer) deine fenster.
die ui-files aus dem designer kannst du in deinem code benutzen, anleitung gibts in der doku: http://doc.qt.nokia.com/4.7/designer-us ... -file.html

das kommt allerdings dann auf dasselbe raus, wie wenn du einfach eine designer-form-klasse hinzufuegst, da wird nichts anderes gemacht als ein ui-file erstellt und eine entspr. QWidget-klasse (bzw. QDialog, QMainWindow, Q...) und nach einem der ansaetze aus der doku mit dem ui-file verheiratet.
das versuchst du scheinbar genauso, nur per hand zu machen.

man kann auch zur laufzeit ui-files laden und anzeigen (QUILoader glaube ich), dann wird afaik ein neues widget mit den entspr. inhalten erstellt.
du muesstest deiner "logik-klasse" also beibringen, fuer alles was sie tun soll auf uiWidget->uiElement zuzugreigen, wobei uiWidget irgendwie intern gespeichert werden muesste.
dann haettest du aber in der klasse keine unterscheidung, welches der beiden ui-widgets du gerade bedienst, d.h. ggf. muesstest du das auch noch einbauen. und an dem punkt wuesste ich nicht, ob 2 ui-klassen nicht einfacher waeren.
ausser wenn 100% dieselbe logik auf den uiElementen arbeiten soll, aber dann haetten beide uiWidgets genau dieselben elemente und ich wuesste nicht, warum man 2 braeuchte.

im endeffekt wuerde man eventuell eher das "abgespeckte" widget zuerst erstellen, das zweite dann davon ableiten und ausschmuecken. mehr klassen, aber mehr uebersicht.

... irgendwie so.

das prinzip logik <-> ui zu trennen, das gerne gepraedigt wird, ist aber eher ein trennung business logik <-> ui logik, denke ich. d.h., du hast deine klasse(n), die die logik regeln, je nach bedarf mit hilfe von Qt-klassen oder ohne. dazu hast du dann deine ui-klassen (widgets, fenster, etc.), und darin wendest du dich fuer die logik ausschliesslich an die nicht-ui-klassen. das kann man dann noch beliebig weiterspinnen, elegant gestalten, usw. der vorteil dabei waere, dass, wenn du mal etwas am ui aendern willst, du das tun kannst, einfach ("einfach") wieder an die "logik"-klassen anbinden, und es laeuft, ohne dass du an der funktionalitaet biegen musst, um sie der ui-struktur anzupassen.
wenn du dann deine nicht-ui-klassen auch qt-unabhaengig gebaut hast, koenntest du auch (relativ) leicht auf andere gui-frameworks umsteigen.

ich hoffe ich habe dich einigermassen richtig verstanden, ansonsten entschuldige ich mich.

schoene gruesse
julian