QSettings speichert und liest Werte nicht

Alles rund um die Programmierung mit Qt
Antworten
DipplInsch
Beiträge: 4
Registriert: 9. April 2009 15:09

QSettings speichert und liest Werte nicht

Beitrag von DipplInsch »

Hallo liebes Forum,

ich nicht nur neu hier sondern auch neu mit QT. Ich habe eine kleine Anwendung geschrieben, die einige Werte in der Registry speichert (Ja es ist ein Windows Programm). Unter anderem wird ein Dateipfad und ein Dateiname gespeichert. Diese werden im Programm in einem lineEdit angezeigt.
Jetzt kommt es manchmal vor, dass nach dem Start des Programmes das lineEdit leer ist, der Wert also nicht (richtig) gelesen wurde.

Ich würde jetzt gerne von euch wissen ob meine Routine zum Speicher korrekt ist. Was mich besonders irritiert ist, dass es manchal geht und dann wieder nicht. Wenn es aber einmal nicht geht, geht es so lange nicht bis ich die entsprechenden Einträge gelöscht haben (Nicht nur die Werte sondern auch die Ordner)

Hier mein Code soweit. Wird jeweils bei Programmstart und -ende ausgeführt.

Code: Alles auswählen

void QT::readSettings()
{
	//Auslesen der Einstellungen
	QSettings settings("Uni Mainz", "Watchdog");
	settings.beginGroup("Einstellungen");
	path = settings.value("Pfad", "C:/").toString();
	file = settings.value("Dateiname", "log.txt").toString();
	ui.ScrollTimeout->setValue(settings.value("ScrollTimeout", 60).toInt());
	ui.ScrollVerz->setValue(settings.value("ScrollVerz", 0).toInt());
	ui.ScrollTrigger->setValue(settings.value("ScrollTrigger", 10).toInt());
	ui.checkBoxAutostart->setChecked(settings.value("autostart",false).toBool());
	settings.endGroup();
}

void QT::writeSettings()
{
	//Speichern der Einstellungen
	QSettings settings("Uni Mainz", "Watchdog");
	settings.beginGroup("Einstellungen");
	settings.setValue("Pfad", path);
	settings.setValue("Dateiname", file);
	settings.setValue("ScrollTimeout", ui.ScrollTimeout->value());
	settings.setValue("ScrollVerz", ui.ScrollVerz->value());
	settings.setValue("ScrollTrigger", ui.ScrollTrigger->value());
	settings.setValue("autostart", ui.checkBoxAutostart->isChecked());
	settings.endGroup();
}
[/quote]


Grüße und schöne Ostern auch allen
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ich sehe nichts Problematisches, allerdings würde ich einiges anders machen.
1. Finger weg von der Registry, spätestens mit Vista wirst du sie verfluchen. Lieber die Einstellungen in INI-Files schreiben, lässt sich auch einfacher debuggen.
2. Ich würde nicht direkt die UI-Elemente lesen und beschreiben, sondern die Werte in Variablen zwischenspeichern. Allein schon um ein Abbrechen des Dialogs/Programms zu ermöglichen, ohne die Variablen zu ändern.

Ansonsten hilft nur debuggen oder genauere Angaben, wo und wann die Funktionen aufgerufen werden.
DipplInsch
Beiträge: 4
Registriert: 9. April 2009 15:09

Vista

Beitrag von DipplInsch »

Tag auch,

vielen Danke schon mal soweit. Das mit den Variablen werde ich dann noch einbauen, hört sich ganz logisch an.

Allerdings hatte ich mit Vista nicht mehr oder weniger Probleme als mit XP. Muss das Auslesen in einer bestimmen Reihenfolge vollzogen werden? Ich denke nicht.

Danke bis hier hin.

DipplInsch
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Häng doch am Ende von writeSettings noche in

Code: Alles auswählen

settings.sync();
a n.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: Vista

Beitrag von macman »

DipplInsch hat geschrieben:Allerdings hatte ich mit Vista nicht mehr oder weniger Probleme als mit XP. Muss das Auslesen in einer bestimmen Reihenfolge vollzogen werden?
Nein, INIs sind aber schneller. Überleg mal wie groß die Registry mit der Zeit wird. Selbst .Net Anwendungen speichern ihre Einstellungen in XML-Dateien und nicht mehr in der Registry, warum wohl? Ausserdem wurde mit Vista die Virtualisierung eingeführt, falls man keine Schreibrechte für die Registry hat. Das kann einen den letzten Nerv kosten.
DipplInsch
Beiträge: 4
Registriert: 9. April 2009 15:09

Geschwindigkeit

Beitrag von DipplInsch »

Hallo macman,

also die Geschwindigkeit ist mir egal, da die Werte nur am Programmstart und Ende geändert werden.

Ausserdem ist die Registrygröße für die Geschwindigkeit egal (Immerhin habe ich 3,3GB nutzbares RAM:-)

Ich werde mal schauen ob sich mit der *.sync() was ändert.


Grüße
Slowmo
Beiträge: 25
Registriert: 21. März 2007 16:02
Kontaktdaten:

Beitrag von Slowmo »

Ich hab dasselbe Problem unter Windows. Während unter Linux alles gut läuft wird unter Windows einfach keine Datei von QSettings angelegt.

Code: Alles auswählen

Settings = new QSettings(QDir::homePath()+"/.project/project.conf", QSettings::NativeFormat, this);
*.sync() hat bei mir auch nichts gebracht.

Irgendwelche Vorschläge?

EDIT: Als Settings->status() gibt bei mir 1 zurück, d.h. es gibt einen Access Error, die DAtei liegt aber im selben Ordner wie alle anderen meines Programms.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Slowmo hat geschrieben:EDIT: Als Settings->status() gibt bei mir 1 zurück, d.h. es gibt einen Access Error, die DAtei liegt aber im selben Ordner wie alle anderen meines Programms.
QSettings::NativeFormat bedeutet unterWindows Registry! Das heißt, du wirst nie in der Datei einen Eintrag finden! Da ich von WIndows keinen Peil hab und die Registry schon immer gehasst habe, kann ich dir nicht sagen, was da los ist.

Ich würde vorschlagen, ihr versucht es einfach mal mit dem QSettings::IniFormat! Wenn es dann funktioniert gibt es ein Problem im Registry-Backend von QSettings. Ansonsten hapert es an QSettings unter WIndows. Ich schätze die Probleme sind verflogen, sobald ihr Ini-Format verwendet.

Da das mit dem Format eine minimale Änderung im SOurce ist, die auch nicht dauerhaft zu Schwierigkeiten führt, solltet ihr das bitte wenigstens versuchen, und nicht nur quer stellen.
Slowmo
Beiträge: 25
Registriert: 21. März 2007 16:02
Kontaktdaten:

Beitrag von Slowmo »

franzf hat geschrieben: QSettings::NativeFormat bedeutet unterWindows Registry! Das heißt, du wirst nie in der Datei einen Eintrag finden! Da ich von WIndows keinen Peil hab und die Registry schon immer gehasst habe, kann ich dir nicht sagen, was da los ist.
Da ich von Windows ebenfalls nicht so viel verstehe wusste ich nicht dass das Native Format in die Registry speichert. Wenn ich in eine ini Datei speichere Funktioniert alles.
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

Slowmo hat geschrieben: Da ich von Windows ebenfalls nicht so viel verstehe wusste ich nicht dass das Native Format in die Registry speichert. Wenn ich in eine ini Datei speichere Funktioniert alles.
Steht aber alles ausführlichst in der Doku.
Antworten