Seite 1 von 1

Settings werden nicht geladen (QSettings)

Verfasst: 27. Februar 2008 13:46
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

Re: Settings werden nicht geladen (QSettings)

Verfasst: 27. Februar 2008 14:10
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?" :-)

Verfasst: 27. Februar 2008 14:25
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

Verfasst: 27. Februar 2008 14:43
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.

Verfasst: 28. Februar 2008 09:39
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

Verfasst: 9. März 2009 23:50
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);
}

Verfasst: 10. März 2009 07:13
von Christian81
Eine kleine Testapplikation bitte.

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

Verfasst: 10. März 2009 23:09
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

write funktioniert, read-Funktion ist in Konstruktor

Verfasst: 10. März 2009 23:17
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

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

Verfasst: 11. März 2009 07:59
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.

Verfasst: 11. März 2009 10:17
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]

Verfasst: 11. März 2009 15:23
von dead-raven
Jup jetzt funktionierts, vielen dank AuE!

@macman: ok

Gruß
DeaD-RaveN