为什么 QSettings 不存储任何内容?
Why does QSettings not store anything?
我想使用 QSettings
来保存我的 window 的尺寸,所以我想出了这两个函数来保存和加载设置:
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。这是为什么?
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 的用法:
我想使用 QSettings
来保存我的 window 的尺寸,所以我想出了这两个函数来保存和加载设置:
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。这是为什么?
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 的用法: