4

我正在尝试创建自定义格式QSettings,但无法从存储中读取它。

在下面的代码中,如果我运行settings.setValue("test", 123"),它会正确调用 write 函数并打印Calling writeSqlite. 但是,如果我尝试settings.value("test"),它不会调用 read 函数并且不会 print 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);
}
4

2 回答 2

3

QSettingsreadSqlite除非设置文件可读大小不为零(显然,如果不满足这些条件,则不需要调用它),否则不会调用自定义读取函数(在您的情况下)。在此处查看源代码

由于您的自定义写入函数并没有真正向 写入任何内容device,因此您的设置文件为空,并且readSqlite不会被调用。

如果你想看到你的readSqlite函数被调用,你可以在你的设置文件中添加一些任意数据,或者在你的实现中添加一些device.write()调用,你的函数将在下一次运行中被调用。writeSqlitereadSqlite

于 2017-01-06T12:07:33.560 回答
0

根据迈克的回答,这是我寻求的解决方案。不漂亮,但它有效:

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);
}
于 2017-01-07T08:59:03.487 回答