QSettings调用beginReadArray()读取结果始终为空,求解决方案
解决QSettings读取ini配置块时beginReadArray返回size为0的问题
嘿,我来帮你搞定这个问题!你遇到的size始终为0的问题,根源是用错了API——beginReadArray()是专门用来读取数组格式的配置项的(比如colors[0] = "#ffffff"这种带索引的结构),而你的[colordefs]块里的是普通键值对,完全不是数组结构,所以它自然返回0啦。
正确的解决方案:动态读取键值对
我们可以通过遍历配置组下的所有子键来动态读取[colordefs]里的所有颜色定义,用映射表存储后,再处理[colors]块时直接替换即可。
第一步:读取[colordefs]的所有颜色定义
QSettings settings("你的配置文件路径.ini", QSettings::IniFormat); QMap<QString, QString> colorDefMap; // 进入colordefs配置组 settings.beginGroup("colordefs"); // 获取该组下的所有子键(也就是所有colors/xxx条目) QStringList colorDefKeys = settings.childKeys(); for (const QString& key : colorDefKeys) { // 读取值并清理掉引号和分号(匹配你的ini格式) QString colorValue = settings.value(key).toString().remove(QRegExp("[\";]")); colorDefMap[key] = colorValue; } settings.endGroup();
第二步:处理[colors]块,替换颜色名称为对应色值
QMap<QString, QString> finalColorConfig; // 进入colors配置组 settings.beginGroup("colors"); QStringList colorConfigKeys = settings.childKeys(); for (const QString& key : colorConfigKeys) { // 获取颜色名称(比如"mint")并清理格式 QString colorName = settings.value(key).toString().remove(QRegExp("[\";]")); // 从映射表中获取对应色值,找不到则用默认值(这里设为黑色) QString finalColor = colorDefMap.value(colorName, "#000000"); finalColorConfig[key] = finalColor; } settings.endGroup();
为什么你的原代码无效?
你的原代码里,在"colordefs"组内调用beginReadArray("colors"),是在找名为colors的数组结构,但你的[colordefs]里根本没有数组——所有条目都是colors/white这种独立键,所以beginReadArray找不到对应数组,返回size=0是完全正常的。
内容的提问来源于stack exchange,提问作者user2377283
相关产品推荐
相关产品推荐

