我试图从两个窗口加载/保存所有QLineEdit
和QTextEdit
的文本,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
后,所有捕获的小部件的文本都变为空白...
此外,是否有“更好”或最有效的方法来编写此任务?
2条答案
按热度按时间5cg8jx4n1#
根据您使用的标记,我假设您正在MS Windows上进行开发。MS Windows中QSettings的NativeFormat是Windows Registry。在您的情况下,作为第一个参数传递的文件路径必须是Windows Registry路径,但您传递的是FILE路径。或者将Windows注册表路径作为第一个参数传递(即HKEY_LOCAL_MACHINE\SOFTWARE\BLABLA),或者使用IniFormat作为第二个参数。
f0brbegy2#
你在
LoadSettings
中混淆了前缀。第二个循环搜索this->widget
,但是从“[M]”前缀加载设置。第三个循环反之亦然。顺便说一句:QSettings支持开箱即用的分组,不需要基于自定义前缀的解决方案。