2016-10-09 37 views
0

我想用QSettings救我的窗口的尺寸,所以我想出了這兩個功能,以節省&負載設置:QSettings爲什麼不存儲任何東西?

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); 

} 

現在,我可以看到被提取的demensions在saveSettings如預期,但沒有文件被創建,因此loadSettings將始終只加載0。爲什麼是這樣?

回答

3

QSettings通常不在堆上實例化。要達到所需的效果,請按照Application Example以及QSettings文檔中的說明進行操作。

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()); 
} 

還要注意使用saveGeometry()restoreGeometry()。基於QWidget的GUI的其他類似有用的功能是saveState()restoreState()(未在上例中顯示)。

我強烈建議the zero parameter constructor of QSettings,並設置默認在您的main.cpp,像這樣:

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

然後,當你想在你的應用程序的任何部分使用QSettings,你只需要做:

QSettings settings; 

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

QSettings一般來說是高度優化的,並且工作得很好。

希望有所幫助。


其他一些地方,我已經說過了QSettings的用法:

Using QSettings in a global static class

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

+0

完美與美麗!謝謝! – cerr

+0

我認爲'QSettings'在堆上分配時不起作用,因爲它沒有被破壞(除非調用'delete')。並且'QSettings'的析構函數需要調用['sync()'](https://doc.qt.io/qt-5/qsettings.html#sync)函數。 – Mike

+0

優秀點。同步功能可以手動調用以使其在堆上工作。 – phyatt

相關問題