无法让QSettings从自定义存储格式中读取

时间:2017-01-05 22:20:30

标签: qt sqlite qt5 storage qsettings

我正在尝试为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);
}

2 个答案:

答案 0 :(得分:3)

QSettings不会调用自定义读取功能(在您的情况下为readSqlite),除非设置文件可读具有非零大小(显然,如果不满足这些条件,则无需调用它)。请参阅source code here

由于您的自定义写入功能并未真正向device写入任何内容,因此您的设置文件将保留为空,并且不会调用readSqlite

如果您希望看到readSqlite功能被调用,您可以在设置文件中添加一些任意数据,或者在writeSqlite实施中添加一些device.write()来电, readSqlite函数将在下次运行时被调用。

答案 1 :(得分: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);
}
相关问题