0

我想用来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但没有创建文件,因此loadSettings总是只加载 0。为什么是这样?

4

1 回答 1

4

QSettings通常不在堆上实例化。要获得您想要的效果,请遵循应用示例以及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()(在上面的示例中未显示)。

我强烈推荐的零参数构造函数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 的用法:

在全局静态类中使用 QSettings

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

于 2016-10-09T03:55:32.977 回答