无法让 QSettings 从自定义存储格式读取
Cannot get QSettings to read from custom storage format
我正在尝试为 QSettings
创建自定义格式,但无法从存储中读取它。
在下面的代码中,如果我 运行 settings.setValue("test", 123")
,它会正确调用写入函数并打印 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
),除非设置文件 可读 且 具有非零大小(显然,如果不满足这些条件,则不需要调用它)。参见 source code here。
由于您的自定义写入函数实际上并未向 device
写入任何内容,因此您的设置文件为空,并且未调用 readSqlite
。
如果你想看到你的 readSqlite
函数被调用,你可以在你的设置文件中添加一些任意数据,或者在你的 writeSqlite
实现中添加一些 device.write()
调用,并且您的 readSqlite
函数将在下一个 运行.
中被调用
根据 Mike 的回答,这就是我寻求的解决方案。不漂亮但很管用:
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);
}
我正在尝试为 QSettings
创建自定义格式,但无法从存储中读取它。
在下面的代码中,如果我 运行 settings.setValue("test", 123")
,它会正确调用写入函数并打印 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
),除非设置文件 可读 且 具有非零大小(显然,如果不满足这些条件,则不需要调用它)。参见 source code here。
由于您的自定义写入函数实际上并未向 device
写入任何内容,因此您的设置文件为空,并且未调用 readSqlite
。
如果你想看到你的 readSqlite
函数被调用,你可以在你的设置文件中添加一些任意数据,或者在你的 writeSqlite
实现中添加一些 device.write()
调用,并且您的 readSqlite
函数将在下一个 运行.
根据 Mike 的回答,这就是我寻求的解决方案。不漂亮但很管用:
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);
}