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
.*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:
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
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