2016-10-09 4 views
0

Ich möchte QSettings verwenden, um meine Fenster Dimensionen zu speichern, so dass ich mit diesen beiden Funktionen kam & Last die Einstellungen zu speichern:Warum speichert QSettings nichts?

void MainWindow::loadSettings() 
{ 
    settings = new QSettings("Nothing","KTerminal"); 
    int MainWidth = settings->value("MainWidth").toInt(); 
    int MainHeight = settings->value("MainHeight").toInt(); 
    std::cout << "loadSettings " << MainWidth << "x" << MainHeight << std::endl; 
    std::cout << "file: " << settings->fileName().toLatin1().data() << std::endl; 
    if (MainWidth && MainHeight) 
     this->resize(MainWidth,MainHeight); 
    else 
     this->resize(1300, 840); 
} 

void MainWindow::saveSettings() 
{ 
    int MainHeight = this->size().height(); 
    int MainWidth = this->size().width(); 

    std::cout << "file: " << settings->fileName().toLatin1().data() << std::endl; 
    std::cout << "saveSettings " << MainWidth << "x" << MainHeight << std::endl; 

    settings->setValue("MainHeight",MainHeight); 
    settings->setValue("MainWidth",MainWidth); 

} 

Jetzt kann ich die demensions in saveSettings extrahiert werden sehen, wie erwartet, aber keine Datei wird erstellt und daher wird loadSettings immer nur 0 laden. Warum ist das?

Antwort

3

QSettings wird normalerweise nicht auf dem Heap instanziiert. Um den gewünschten Effekt zu erzielen, folgen Sie der Application Example und wie es in der QSettings Dokumentation angezeigt wird.

void MainWindow::readSettings() 
{ 
    QSettings settings(QCoreApplication::organizationName(), QCoreApplication::applicationName()); 
    const QByteArray geometry = settings.value("geometry", QByteArray()).toByteArray(); 
    if (geometry.isEmpty()) { 
     const QRect availableGeometry = QApplication::desktop()->availableGeometry(this); 
     resize(availableGeometry.width()/3, availableGeometry.height()/2); 
     move((availableGeometry.width() - width())/2, 
      (availableGeometry.height() - height())/2); 
    } else { 
     restoreGeometry(geometry); 
    } 
} 

void MainWindow::writeSettings() 
{ 
    QSettings settings(QCoreApplication::organizationName(), QCoreApplication::applicationName()); 
    settings.setValue("geometry", saveGeometry()); 
} 

Beachten Sie auch die Verwendung von saveGeometry() und restoreGeometry(). Andere ähnlich nützliche Funktionen für QWidget basierte GUIs sind saveState() und restoreState() (im obigen Beispiel nicht gezeigt).

I the zero parameter constructor of QSettings wird dringend empfohlen, und Setup die Standardwerte in Ihrer main.cpp, etwa so:

QSettings::setDefaultFormat(QSettings::IniFormat); // personal preference 
qApp->setOrganizationName("Moose Soft"); 
qApp->setApplicationName("Facturo-Pro"); 

Dann, wenn Sie QSettings in jedem Teil Ihrer Anwendung verwenden möchten, können Sie einfach tun:

QSettings settings; 

settings.setValue("Category/name", value); 
// or 
QString name_str = settings.value("Category/name", default_value).toString(); 

QSettings im Allgemeinen ist hoch optimiert und funktioniert wirklich gut.

Hoffe, dass hilft.


einige andere Orte, an denen ich auf Nutzung von QSettings gesprochen haben:

Using QSettings in a global static class

https://stackoverflow.com/a/14365937/999943

+0

Perfekt & Beautiful! Vielen Dank! – cerr

+0

Ich denke, dass der Grund für 'QSettings' nicht funktioniert, wenn er auf dem Heap zugewiesen wird, weil er nicht zerstört wird (es sei denn,' delete' wird aufgerufen). Und der Destruktor von 'QSettings' wird benötigt, um seine [' sync() '] (https://doc.qt.io/qt-5/qsettings.html#sync) Funktion aufzurufen. – Mike

+0

Ausgezeichneter Punkt. Die Synchronisierungsfunktion kann manuell aufgerufen werden, um sie auf dem Heap zu verwenden. – phyatt