PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [QT] Designfrage



BeS
16-02-2004, 21:52
Hallo,
ich arbeite mich gerade in QT ein und stehe jetzt vor einem Problem.
Ich habe zwei Klassen (QObjecte) erstellt.
Eine verwaltet die Daten und die andere ist die GUI. In main.cpp werden dann beide instanziiert.
Jetzt habe ich das Problem wie ich die beiden verbinde. Bei einfachen Sachen, wie z.B. die Daten wieder auf 0 setzen, schicke ich einfach aus der GUI-Klasse ein Signal los und verbinde es in main.cpp mit dem entsprechenden slot der Daten-Klasse.
Aber es gibt halt auch die Funktion das ich einen Wert den ich in die GUI eingegeben habe an die Daten-Klasse schicken muß, die soll dann damit verschiedene Sachen berechnen und die Ergebnisse wieder zurückschicken damit sie in der GUI ausgegeben werden können.
Als letztes gibt es dann noch die Funktion die beim click auf einen Button nur die Statistik von den bisher berechneten Werten aus der Daten-Klasse hohlen soll und anzeigen soll.

Bei den letzten beiden Funktionen habe ich das Problem das Signale bekanntlich keinen Rückgabewert haben. Wie löse ich sowas also?
Ich habe mir überlegt das ich z.B. das Berechnensignal mit dem Wert losschicke, in der main.cpp wieder mit der Daten-Klasse verbinden und die Datenklasse dann wieder ein neues Signal mit den berechneten Werten zurückschickt.
Das kommt mir aber irgendwie nicht so elegant vor?

Ich hoffe ich habe die Situation einigermaßen verständlich beschrieben.
Wie kann ich das am besten lösen?

Danke!

tuxipuxi
17-02-2004, 13:05
hi,

kann die GUI instanz nicht einen pointer auf die instanz der daten klasse halten oder willst du das getrennt halten?

gruss,
michael.

edit: kann sein, dass die antwort blöd erscheint, aber die informationen sind recht spärlich. wäre zum beispiel auch interessant zu wissen, was das für daten sind, ob sie nur für die GUI gedacht sind u.ä.

BeS
17-02-2004, 13:27
Hallo,
vielleicht erstmal noch etwas zu dem Programm, damit man es sich besser vorstellen kann. Es ist ein kleines Notenberechnungsprogramm.
Ich habe also die GUI in der man die maximalen Punkte und mit wieviel Prozent man bestanden hat eingibt und der Benutzer dann immer die erreichten Punkte eingibt und das Programm die Note anzeigt. Dann gibt es halt noch die Option alles zurückzusetzen, die letzte Berechnung rückgängig zu machen und am ende eine Statistik auszugeben (bestanden, nichtbestanden, Durchschnitt,...)

Dazu habe ich zwei Klassen eine die mir die GUI bereitstellt und eine Klasse die sich komplett um die Noten kümmert: berechnung, rückgängig machen, statistik sammeln.

Ich hoffe die zusammenhänge sind jetzt klarer geworden.


Original geschrieben von tuxipuxi
kann die GUI instanz nicht einen pointer auf die instanz der daten klasse halten oder willst du das getrennt halten?


prinzipiell sicher eine Möglichkeit, nur bin ich mir jetzt herade nicht sicher wie ich das machen soll?

Also meine main.cpp sieht so aus:


#include <qapplication.h>

#include "interface/mainwindow.h"
#include "notenverwaltung/noten.h"

int main( int argc, char* argv[] )
{
QApplication app(argc, argv);

Noten *notenliste = new Noten;
notenliste->initNotenliste(90, 50);

MainWindow *mw = new MainWindow;

app.setMainWidget(mw);

/* connect mainwindow and marklist */
QObject::connect(mw, SIGNAL(setMax(int)), notenliste, SLOT(setMax(int)));
QObject::connect(mw, SIGNAL(setMin(int)), notenliste, SLOT(setMin(int)));


mw->show();

return app.exec();
}


wie bekommt jetzt das MainWindow einen pointer auf die Notenliste?
Das müsste ich doch jetzt irgendwie übergeben, wenn eine instanz vom mainWindow erzeugt wird, oder?

Danke!

tuxipuxi
17-02-2004, 16:24
hi,

konstruktor von MainWindow erweitern um ein Noten* oder die notenliste gleich zu einer membervariablen von MainWindow machen.

gruss,
michael.

anda_skoa
17-02-2004, 17:52
Du kannst die Instanz von Noten in MainWindow instanziieren, außerhalb, also in einem weiteren Objekt oder main() brauchst du es ja nicht mehr.

Ciao,
_

SumpfMonsterJun
25-02-2004, 20:31
Wie wärs mit der Benutzung vom Beobachtermuster?

SumpfMonsterJun
25-02-2004, 20:37
Mach füge einfach noch eine Klasse Daten hinzu, die alle notwendigen Getter und Setterfunktionen hat und übergebe einfach eine Referenz darauf im Konstruktor der GUI-Klasse.

Gruss, SMJ

BeS
25-02-2004, 23:47
Original geschrieben von SumpfMonsterJun
Wie wärs mit der Benutzung vom Beobachtermuster?

was sind Beobachtungsmuster?


Original geschrieben von SumpfMonsterJun
Mach füge einfach noch eine Klasse Daten hinzu, die alle notwendigen Getter und Setterfunktionen hat und übergebe einfach eine Referenz darauf im Konstruktor der GUI-Klasse.


Ich habe es jetzt so gemacht, wie es auch tuxipuxi vorgeschlagen hat. Ich habe einfach die Klasse mit der Notenliste in main instanziiert und dann an die GUI Klasse übergeben.

SumpfMonsterJun
26-02-2004, 11:18
was sind Beobachtungsmuster?

http://www.amazon.de/exec/obidos/ASIN/3827318629/qid=1077794239/sr=2-1/ref=sr_aps_prod_1_1/302-9548351-2552805

Zitat aus dem Entwurfsmusterbuch bon Gamma:

"Definiere eine 1-zu-n-Abhängigkeit zwischen Objekten, so daß eine Änderung des Zustands eines Objekts dazu führt, daß alle abhängigen Objekte benachrichtigt werden und automatisch aktualisiert werden."

Auch besser bekannt als Model/View-Architektur.

Man hat ein Subjekt (in Deinem Fall die Klasse Noten) und einen oder mehrere Beobachter (in Deinem Fall die GUI-Klasse). In Pseudocode sieht das folgendermaßen aus:



class Subjekt
{
MeldeAn( Beobachter )
MeldeAb( Beobachter )
GibZustand()
SetzeZustand()
{
Ändere den Zustand
Benachrichtige()
}
Benachrichtige()
{
für alle b in beobachter
b->Aktualisiere()
}
};

class Beobachter
{
Beobachter( Subjekt )
Aktualisiere()
{
beobachterZustand = m_subjekt->GibZustand
}
private:
m_subjekt = Referenz auf Subjekt
};