Settings werden nicht geladen (QSettings)

Alles rund um die Programmierung mit Qt
Antworten
jd
Beiträge: 130
Registriert: 22. Januar 2008 17:55

Settings werden nicht geladen (QSettings)

Beitrag von jd »

Hallo, ich habe ein Problem mit QSettings, wobei mich mir nicht sicher bin ob das ein Problem von QSettings ist...

Ich habe ein QMainWindow und ein QDialog.

In meinem QDialog mache ich ein paar Einstellungen, die via QSettings abgespeichert werden. Das funktioniert auch, die Settings werden auch wieder geladen. Nur habe ich das Problem, das ich in meinem QMainWindow die Settings nicht laden kann.

QDialog (funktioniert ohne Probleme):

*.h

Code: Alles auswählen

public:
  CSettings *configuration;
.*cpp

Code: Alles auswählen

configuration = new CSettings;
SyslogCheckBox->setChecked(configuration->settings.syslog);
Das ganze klappt wunderbar, mache ich das selbe in meinem QMainWindow geht das nicht, da configuration->settings.syslog immer false ist, obwohl in der config-file true steht.

Hat jemand da eine idee?

so long

jd
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: Settings werden nicht geladen (QSettings)

Beitrag von macman »

jd hat geschrieben:Hat jemand da eine idee?
Ja, einen Debugger nutzen. Oder etwas mehr Infos zu deiner CSettings-KLasse, denn da scheint was nicht zu funktionieren. Die bisherigen Informationen hätten auch in eine Zeile gepasst, "mein Programm funktioniert nicht, jemand ne Idee?" :-)
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
jd
Beiträge: 130
Registriert: 22. Januar 2008 17:55

Beitrag von jd »

settings.h

Code: Alles auswählen

typedef struct {
	// general
	bool systemTray;
	// control
	bool syslog;
	QString syslogPath;
	// other
	bool firstrun;
} SConfiguration;

class CSettings {
	public:
		CSettings();
		~CSettings() {}

		void read();
		void write();
		void writeValue( const QString key, const QVariant value );

		static SConfiguration settings;
};
settings.cpp

Code: Alles auswählen

#include "settings.h"

SConfiguration CSettings::settings;

CSettings::CSettings() {
	read();
}

void CSettings::read() {
	QSettings applicationSettings;
	// gerneral
	settings.systemTray = applicationSettings.value("general/systemTray").toBool();
	// control
	settings.syslog = applicationSettings.value("control/syslog").toBool();
	settings.syslogPath = applicationSettings.value("control/syslogPath").toString();
	// other
	settings.firstrun = applicationSettings.value("other/firstrun").toBool();

	applicationSettings.deleteLater();
}

void CSettings::write() {
	QSettings applicationSettings;
	// general
	applicationSettings.setValue("general/systemTray", settings.systemTray);
	// control
	applicationSettings.setValue("control/syslog", settings.syslog);
	applicationSettings.setValue("control/syslogPath", settings.syslogPath);
	// other
	applicationSettings.setValue("other/firstrun", settings.firstrun);

	applicationSettings.deleteLater();
}

void CSettings::writeValue( QString key, QVariant value) {
	QSettings applicationSettings;

	applicationSettings.setValue(key, value);

	applicationSettings.deleteLater();
}
Wenn der fehler in der Klasse liegt, warum funktioniert dann alles in der QDialog Klasse und in QMainWindow nicht? Den Debugger habe ich auch schon angeworfen und meine Vermutung ist, das er die read() Funktion nicht richtig ausführt, aber bei in der QDialog-Klasse macht er es.

so long jd
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

jd hat geschrieben:Wenn der fehler in der Klasse liegt, warum funktioniert dann alles in der QDialog Klasse und in QMainWindow nicht?
Ok, in der Klasse sehe ich keinen Fehler, ausser das Du keine Defaultwerte angibst, für den Fall das noch keine Settings vorhanden sind.
jd hat geschrieben:Den Debugger habe ich auch schon angeworfen und meine Vermutung ist, das er die read() Funktion nicht richtig ausführt
Wenn Du mit dem Debugger umgehen kannst, dann step doch da durch. So ein Fehler sollte doch recht einfach zu finden sein, wenn man den Wert der Variablen im Auge behält.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
jd
Beiträge: 130
Registriert: 22. Januar 2008 17:55

Beitrag von jd »

So habe das Problem gefunden und auch gelöst, jedoch fehlt mir da etwas Erklärung.

Ich habe das ganze in eine Funktion verpackt.

Code: Alles auswählen

void CMainWindow::loadSettings() {
	configuration = new CSettings;

	createTrayIcon();

	if (configuration->settings.syslog) {

	} else {
		QMessageBox::information(this, tr("Syslog"), tr("test.\n"));
	}

}
Diese wird in dem Konstruktor von meinem MainWindow aufgerufen, geht nicht. Nun habe ich das aus dem Konstruktor raus genommen und rufe die Funktion aus main heraus manuell auf:

Code: Alles auswählen

window->show();
		window->loadSettings();
		app.exec();
So und das klappt wunderbar. Kann mir jemand sagen warum das ganze nicht im Konstruktor klappt?

so long

jd
dead-raven
Beiträge: 23
Registriert: 18. Dezember 2008 23:20

Beitrag von dead-raven »

Der letzte Beitrag zu diesem Thread ist zwar schon ein Weilchen her...

Stehe vor der selben Herrausforderung:

QSettings liest Daten beim Programmstart nur aus Registry, wenn die Methode dafür in der main.cpp aufgerufen wird.
Wird diese im Konstruktor aufgerufen, werden die Werte nicht ausgelesen.
Speichern durch Methodenaufruf im Destruktor funktioniert einwandfrei.

Code: Alles auswählen

void MainWindow::readSettings(){
    QSettings settings;
    resize(settings.value("MainWindow/Size", sizeHint()).toSize());     
    restoreState(settings.value("MainWindow/Properties").toByteArray());
    QString hallo = settings.value("MainWindow/Text", "ich bin eine alternative").toString();
    textEdit->setPlainText(hallo);
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Eine kleine Testapplikation bitte.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dead-raven
Beiträge: 23
Registriert: 18. Dezember 2008 23:20

read + write funktioniert, read-Funktion in main.cpp

Beitrag von dead-raven »

Die nächsten zwei Posts enthalten die Testapplicationen.

Es wird ein MainWindow geöffnet, welches beim öffnen die Fenstergröße aus der Registry lesen und anpassen soll.
Beim schließen der Application soll das Programm die aktuelle Fenstergröße in die Registry schreiben.

Das schreiben stellt kein Problem dar, lesen geht hingegen nur, wenn die read-Funktion in der main.cpp aufgerufen wird (im Konstruktor funktionierts nicht).

Programm 1: read-Funktion in main.cpp (funktioniert)

Code: Alles auswählen

//main.cpp

#include <QApplication>
#include "mainwindow.h"

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    MainWindow mainwindow;
    mainwindow.show();
    
    QCoreApplication::setOrganizationName("Testsoftware");
    QCoreApplication::setOrganizationDomain("testsoftware.com");
    QCoreApplication::setApplicationName("test");
    
    mainwindow.readSettings();
    
    return app.exec();
}

Code: Alles auswählen

//mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "ui_mainwindow.h"
#include <QMainWindow>

class MainWindow : public QMainWindow, private Ui::MainWindow
{
    Q_OBJECT
    
    public:
        MainWindow(QWidget *parent=0);
        ~MainWindow();
        void readSettings();        
    protected:
        void writeSettings();
};

#endif //MAINWINDOW_H

Code: Alles auswählen

//mainwindow.cpp

#include "mainwindow.h"
#include <QSettings>

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent){
    setupUi(this);
}

void MainWindow::readSettings(){
    QSettings settings;
    resize(settings.value("MainWindow/Size", sizeHint()).toSize());
}
void MainWindow::writeSettings(){
    QSettings settings;
    settings.setValue("MainWindow/Size", size());
}
MainWindow::~MainWindow(){
    writeSettings();
}

Code: Alles auswählen

/********************************************************************************
** Form generated from reading ui file 'mainwindow.ui'
**
** Created: Tue 10. Mar 22:55:26 2009
**      by: Qt User Interface Compiler version 4.5.0
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QMenuBar *menubar;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(296, 331);
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
        MainWindow->setCentralWidget(centralwidget);
        menubar = new QMenuBar(MainWindow);
        menubar->setObjectName(QString::fromUtf8("menubar"));
        menubar->setGeometry(QRect(0, 0, 296, 21));
        MainWindow->setMenuBar(menubar);
        statusbar = new QStatusBar(MainWindow);
        statusbar->setObjectName(QString::fromUtf8("statusbar"));
        MainWindow->setStatusBar(statusbar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(MainWindow);
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H
dead-raven
Beiträge: 23
Registriert: 18. Dezember 2008 23:20

write funktioniert, read-Funktion ist in Konstruktor

Beitrag von dead-raven »

Programm 2: read-Funktion im Konstruktor (funktioniert nicht)

Code: Alles auswählen

//main.cpp

#include <QApplication>
#include "mainwindow.h"

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    MainWindow mainwindow;
    mainwindow.show();
    
    QCoreApplication::setOrganizationName("Testsoftware");
    QCoreApplication::setOrganizationDomain("testsoftware.com");
    QCoreApplication::setApplicationName("test");
    
    return app.exec();
}

Code: Alles auswählen

//mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "ui_mainwindow.h"
#include <QMainWindow>

class MainWindow : public QMainWindow, private Ui::MainWindow
{
    Q_OBJECT
    
    public:
        MainWindow(QWidget *parent=0);
        ~MainWindow();       
    protected:
        void readSettings(); 
        void writeSettings();
};

#endif //MAINWINDOW_H

Code: Alles auswählen

//mainwindow.cpp

#include "mainwindow.h"
#include <QSettings>

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent){
    setupUi(this);
    readSettings();
}

void MainWindow::readSettings(){
    QSettings settings;
    resize(settings.value("MainWindow/Size", sizeHint()).toSize());
}
void MainWindow::writeSettings(){
    QSettings settings;
    settings.setValue("MainWindow/Size", size());
}
MainWindow::~MainWindow(){
    writeSettings();
}

Code: Alles auswählen

/********************************************************************************
** Form generated from reading ui file 'mainwindow.ui'
**
** Created: Tue 10. Mar 22:55:26 2009
**      by: Qt User Interface Compiler version 4.5.0
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QMenuBar *menubar;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(296, 331);
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
        MainWindow->setCentralWidget(centralwidget);
        menubar = new QMenuBar(MainWindow);
        menubar->setObjectName(QString::fromUtf8("menubar"));
        menubar->setGeometry(QRect(0, 0, 296, 21));
        MainWindow->setMenuBar(menubar);
        statusbar = new QStatusBar(MainWindow);
        statusbar->setObjectName(QString::fromUtf8("statusbar"));
        MainWindow->setStatusBar(statusbar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(MainWindow);
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H
Gruß
DeaD-RaveN
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: read + write funktioniert, read-Funktion in main.cpp

Beitrag von macman »

dead-raven hat geschrieben:Die nächsten zwei Posts enthalten die Testapplicationen.
Wenn um eine Testapplikation gebeten wird, dann erwarte ich etwas zum downloaden :roll:
Das könnte man schnell testen. So muss man erst Ordner erstellen, Dateien erstellen, Copy&Paste, Projekt erstellen, und dann kann man erst compilieren und debuggen. Dauert bis ich mir die Zeit nehme. Die Wahrscheinlichkeit ist groß, das ich es bis dahin vergessen habe.

Keine Ahnung ob viele genauso denken, kann es mir aber gut vorstellen.

Nicht persönlich nehmen, bist nicht der Erste und mit Sicherheit nicht der letzte, der hier ellenlangen Code postet, der dann ignoriert wird.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindowClass)
{
    ui->setupUi(this);
    readSettings();
}

MainWindow::~MainWindow()
{
    writeSettings();
    delete ui;
}

void MainWindow::readSettings()
{
  QSettings settings("MySoft", "Star Runner");
  QString x = settings.value("Test/xx").toString();
  qDebug() << x;

}

void MainWindow::writeSettings()
{
    QSettings settings("MySoft", "Star Runner");
    settings.setValue("TEST/xx", "Das schrieb ich");
}

App Output:
warning: "Das schrieb ich"

Qt 4.5

Evtl

sollte dies hier

Code: Alles auswählen

 
[b]mainwindow.show(); [/b]
    
    QCoreApplication::setOrganizationName("Testsoftware"); 
    QCoreApplication::setOrganizationDomain("testsoftware.com"); 
    QCoreApplication::setApplicationName("test");
umdrehen. Da der Konstruktor deiner Klasse durchlaufen wird bevor du deine Organisation etc setzt und somit nicht definiert ist woraus du liest...


EDIT:

Habs nochmal getestet:

FALSCH:

Code: Alles auswählen

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

    MainWindow w;

    QCoreApplication::setOrganizationName("Testsoftware");
    QCoreApplication::setOrganizationDomain("testsoftware.com");
    QCoreApplication::setApplicationName("test");


    w.show();



    return a.exec();
}



RICHTIG:

Code: Alles auswählen

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



    QCoreApplication::setOrganizationName("Testsoftware");
    QCoreApplication::setOrganizationDomain("testsoftware.com");
    QCoreApplication::setApplicationName("test");

    MainWindow w;

    w.show();



    return a.exec();
}
[/u][/i]
dead-raven
Beiträge: 23
Registriert: 18. Dezember 2008 23:20

Beitrag von dead-raven »

Jup jetzt funktionierts, vielen dank AuE!

@macman: ok

Gruß
DeaD-RaveN
Antworten