【问题标题】:Why does QSettings not store anything?为什么 QSettings 不存储任何内容?
【发布时间】:2016-10-09 03:35:40
【问题描述】:

我想使用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。这是为什么呢?

【问题讨论】:

    标签: qt qsettings


    【解决方案1】:

    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

    【讨论】:

    • 完美而美丽!谢谢!
    • 我认为QSettings在堆上分配时不起作用的原因,因为它没有被破坏(除非delete被调用)。而QSettings的析构函数需要调用它的sync()函数。
    • 好点。可以手动调用同步函数以使其在堆上工作。
    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多