[gelöst] MainWindow und Dialog Einstellungen: Wie Werte ...

Alles rund um die Programmierung mit Qt
Antworten
qmaddin
Beiträge: 31
Registriert: 15. Mai 2007 17:32

[gelöst] MainWindow und Dialog Einstellungen: Wie Werte ...

Beitrag von qmaddin »

Ursprünglicher Titel: MainWindow und Dialog Einstellungen: Wie Werte übergeben?
Hallo,

ich habe ein Hauptfenster MainWindow und einen Dialog "Einstellungen", welchen ich aus dem Hauptfenster aufrufen kann.
Das Hauptfenster hat einige Membervariablen, die Einstellungen beinhalten, welche in dem Einstellungen-Dialog verändert werden sollen.

Wie muss ich nun die Datenübergabe vornehmen?

Szenario a: Beim Klick auf den Button, der den Dialog öffnet, werden die Daten vom MainWindow in den Dialog geschrieben und nach Schließen des Dialogs werden die Daten vom MainWindow aus dem Dialog gelesen und in den MainWindow-Membern gespeichert.
Nachteil: Elemente des Dialogs, die beschrieben/gelesen werden müssten, müssen in der Klasse Dialog public sein. Das empfinde ich als unsauber.

Szemario b: Wie Szenario a, aber der Dialog hat public set- und get-Funktionen für die Elemente, die geändert werden müssen: Eigentlich viel Aufwand, aber die sauberste Lösung, die meine Gehirnwindungen momentan hergeben.

Szenario c: Ein globales Objekt settings, das vor main() erzeugt wird und sämtliche Einstellungen beinhaltet, entweder public oder private mit get und set.
Das Objekt wird dann per extern settings; jeder Klasse bekannt gemacht wird. Dies empfinde ich als unsauberer als Szenario a, aber dennoch leichter als b.

Ich bin doch nicht der einzige, der einen Einstellungen-Dialog braucht. Gibt es hier eine einfache Möglichkeit, die Daten zu übergeben? Wie ist eine einfache Möglichekeit, die Daten zu speichern?

Danke für Eure Mühen,
QMaddin
Zuletzt geändert von qmaddin am 20. September 2009 08:41, insgesamt 1-mal geändert.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Was hälst du von QSettings?
Wo einfach der Dialog beim "OK" die Werte schreibt und noch ein "newSettings" Signal emitieren kann?(wahlweise auch durch abfragen was der dlg rückgabewert war und aus der mainklasse raus senden)
John Darius
Beiträge: 8
Registriert: 20. April 2009 18:18

Beitrag von John Darius »

Oder alternativ eine config-Datei anlegen und die Daten dort ablegen.

Falls es sich um temporäre Daten handelt die nicht (etwa zum nächsten Programmstart) wieder verfügbar sein müssen einfach per SIGNAL und SLOT
LG: Günter W.
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Variant 1: Singleton Klasse
Variant 2: Signals and Slots

LG NoRulez
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Ich glaube der Autor müsste erst mal sagen was er speichern willl und wie persistent die Daten sein sollten. Man kanmn ja auch ne conf file nach /tmp schreiben....
qmaddin
Beiträge: 31
Registriert: 15. Mai 2007 17:32

Beitrag von qmaddin »

Die Daten, die gespeichert werden sollen, sind mengenmäßig 3 int, 2 QString und 1 bool.

Die Daten werden beim Start von MainWindow mittels QSettings eingelesen. Idee war, diese Daten in MainWindow als Membervariable zu speichern. So hat MainWindow Zugriff.

Die Daten werden beim Beenden von MainWindow mittels QSettings geschrieben.

Während der Laufzeit sollen die Daten MainWindow und dem Einstellungen-Dialog zur Verfügung stehen, sowohl zum auslesen, als auch zum beschreiben.

Lohnt es sich hier, die Klasse QSettings abzuleiten als meinetwegen Settings. Ein Objekt dieser Klasse gehört dann MainWindow.
In Settings werden dann die Daten gespeichert, im Konstruktor/Destruktor werden sie mittels QSettings eingelesen/weggespeichert.
Und dann übergebe ich dem Dialog einen *Settings-Pointer auf eben diesen Member? Hier umgehe ich aber wieder private...

Ich wollte nicht im Dialog ein QSettings-Objekt aufmachen, da ich ja die Daten aus MainWindow übernehmen wollte.
Eben nach dem Schema: Daten werden beim Start einmal ausgelesen, beim Ende einmal in die Datei geschrieben. Zwischendrin existieren die gültigen Daten nur im MainWindow.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Hört sich nach nem Singleton mit gettern und settern an wenns so wenig ist.
Dann musst gar nicht speichern Hast von überall her Zugriff auf die Daten die das Singleton kennen!
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

qmaddin hat geschrieben: Und dann übergebe ich dem Dialog einen *Settings-Pointer auf eben diesen Member?
Wenn Du einen Pointer dereferenzierst hast Du sowieso keinen Pointer mehr.

Wie gesagt, entweder eine Singleton Klasse verwenden, oder jedesmal ein QSettings Objekt laden und speichern. Ich weiß nicht genau was Du vor hast. was ist wenn der Benutzer die Daten direkt in der Configdatei ändert, werden diese dann während des Betriebes überschrieben? Falls JA, dann würde ich das mit QSettings machen.

Bzw. kannst Du einen Mix aus beiden machen, indem Du in der Singelton Klasse jedesmal speicherst bzw. lädst wenn Du eine getter oder setter Methode aufrufst. Somit geht das dann auch ganz transparent.

LG NoRulez
qmaddin
Beiträge: 31
Registriert: 15. Mai 2007 17:32

Beitrag von qmaddin »

Ich habe mich jetzt für Lösung b) entschieden, der Dialog hat 6 set und 6 get-Methoden bekommen. Eine extra Klasse war mir zu aufwändig, wäre aber bei mehr Variablen durchaus eine Überlegung wert!
Danke für Eure Anregungen!
QMaddin
Antworten