2016-10-09 9 views
0

私は&負荷に設定を保存するために、これらの2つの機能を思い付いたように、私の窓の大きさを保存するために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); 

} 

を今、私は予想通りsaveSettingsに抽出されdemensionsしかし、誰のファイルを見ることができます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()(上の例には示されていません)です。

私は強くそうのように、あなたのmain.cppthe zero parameter constructor of QSettings、および設定にデフォルト値をお勧めします。

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'が呼び出されない限り、それが破壊されていないので、ヒープに割り当てられたときには動作しないと思います。また、 '' Sync() '(https://doc.qt.io/qt-5/qsettings.html#sync)関数を呼び出すには、' QSettings'のデストラクタが必要です。 – Mike

+0

優れたポイント。シンク関数を手動で呼び出して、ヒープ上で動作させることができます。 – phyatt

関連する問題