我正在尝试为QSettings
创建自定义格式,但我无法让它从存储中读取。
在下面的代码中,如果我运行settings.setValue("test", 123")
,它会正确调用 write 函数并打印Calling writeSqlite
。但是,如果我尝试settings.value("test")
,它不会调用读取函数,也不会打印Calling readSqlite
。
知道可能是什么问题吗?
bool readSqlite(QIODevice &device, QSettings::SettingsMap &map) {
qDebug() << "Calling readSqlite";
return true;
}
bool writeSqlite(QIODevice &device, const QSettings::SettingsMap &map) {
qDebug() << "Calling writeSqlite";
return true;
}
void Settings::initialize() {
const QSettings::Format SqliteFormat = QSettings::registerFormat("sqlite", &readSqlite, &writeSqlite);
QSettings::setDefaultFormat(SqliteFormat);
QSettings settings;
// This doesn't work:
// qDebug() << settings.value("test");
// This works:
// settings.setValue("test", 123456);
}
QSettings
不会调用自定义读取函数(在您的情况下readSqlite
),除非设置文件可读且大小为非零(显然,如果不满足这些条件,则不需要调用它)。在此处查看源代码。
由于您的自定义写入函数并没有真正向device
写入任何内容,因此您的设置文件留空,并且不会调用readSqlite
。
如果你想看到你的readSqlite
函数被调用,你可以向你的设置文件添加一些任意数据,或者在你的writeSqlite
实现中添加一些device.write()
调用,你的readSqlite
函数将在下一次运行中被调用。
根据迈克的回答,这就是我想要的解决方案。不漂亮,但它有效:
bool readSqlite(QIODevice &device, QSettings::SettingsMap &map) {
// Read the map from SQL database
return true;
}
bool writeSqlite(QIODevice &device, const QSettings::SettingsMap &map) {
device.write("X", 1); // HACK - required to get readSqlite to work
// Write the map to SQL database
return true;
}
void Settings::initialize() {
const QSettings::Format SqliteFormat = QSettings::registerFormat("sqlite", &readSqlite, &writeSqlite);
QSettings::setDefaultFormat(SqliteFormat);
}