使用QSettings加载/保存设置



我试图从两个窗口加载/保存所有QLineEditQTextEdit的文本,mainwindow和另一个称为widget,这就是我如何保存/加载它:

void LoadSettings()
{
QString m_sSettingsFile = 
QApplication::applicationDirPath() + "/demosettings.ini";
QSettings settings(m_sSettingsFile, QSettings::NativeFormat);
for (auto btn : this->findChildren<QLineEdit*>())
{
QString text = settings.value("[M]" + btn->objectName(), "").toString();
btn->setText(text);
}
for (auto btn : this->widget.findChildren<QTextEdit*>())
{
QString text = settings.value("[M]" + btn->objectName(), "").toString();
btn->setText(text);        
}
for (auto btn : this->findChildren<QLineEdit*>())
{
QString text = settings.value("[W]" + btn->objectName(), "").toString();
btn->setText(text);
}
for (auto btn : this->widget.findChildren<QTextEdit*>())
{
QString text = settings.value("[W]" + btn->objectName(), "").toString();
btn->setText(text);        
}
}

void SaveSettings()
{
QString m_sSettingsFile = 
QApplication::applicationDirPath() + "/demosettings.ini";
QSettings settings(m_sSettingsFile, QSettings::NativeFormat);
for (auto btn : this->findChildren<QLineEdit*>())
settings.setValue("[M]" + btn->objectName(), btn->text());
for (auto btn : this->findChildren<QTextEdit*>())
settings.setValue("[M]" + btn->objectName(), btn->toPlainText());
for (auto btn : this->widget.findChildren<QLineEdit*>())
settings.setValue("[W]" + btn->objectName(), btn->text());
for (auto btn : this->widget.findChildren<QTextEdit*>())
settings.setValue("[W]" + btn->objectName(), btn->toPlainText());
}

但是在调用Loading之后,所有捕获的小部件的文本都变成空白…

还有,有没有"更好"或最有效的方法来写这个任务?

根据您使用的标签,我假设您正在MS Windows上进行开发。MS Windows中QSettings的NativeFormat是Windows Registry。在您的情况下,作为第一个参数传递的文件路径必须是Windows注册表路径,但是您传递的是file路径。传递一个windows注册表路径作为第一个参数(即HKEY_LOCAL_MACHINESOFTWAREBLABLA),或使用IniFormat作为第二个参数。

您在LoadSettings中混淆了前缀。第二个循环搜索this->widget,但从"[M]"前缀。第三个循环,反之亦然。

附带说明:QSettings支持开箱即用的分组,不需要基于自定义前缀的解决方案。

最新更新