使用QSetting读取ini中的信息并打印

发布时间:2026/9/27 6:40:00
使用QSetting读取ini中的信息并打印 QT - gui CONFIG c11 console CONFIG - app_bundle SOURCES main.cpp#include QCoreApplication #include QSettings #include QDebug int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 使用源码目录的绝对路径 QString configPath d:/QtCode/IniTest/config.ini; qDebug() configPath: configPath; QSettings settings(configPath, QSettings::IniFormat); // 调试检查文件是否找到 if (settings.allKeys().isEmpty()) { qDebug() 警告: 未读取到任何配置项请检查文件路径; } qDebug() 方式一: allKeys 遍历所有键值 ; const QStringList allKeys settings.allKeys(); for (const QString key : allKeys) { qDebug().noquote() key settings.value(key).toString(); } qDebug() \n 方式二: 按 section/key 读取 ; qDebug() user/name settings.value(user/name).toString(); qDebug() user/age settings.value(user/age).toInt(); qDebug() server/host settings.value(server/host).toString(); qDebug() server/port settings.value(server/port).toInt(); qDebug() server/notExist (默认值) settings.value(server/notExist, 12345).toInt(); qDebug() logging/enabled settings.value(logging/enabled).toBool(); qDebug() \n 方式三: beginGroup 分组读取 ; settings.beginGroup(server); qDebug() host settings.value(host).toString(); qDebug() port settings.value(port).toInt(); qDebug() timeout settings.value(timeout).toInt(); settings.endGroup(); qDebug() \n 方式四: 遍历所有分组 ; const QStringList groups settings.childGroups(); for (const QString group : groups) { qDebug() section: group; } return 0; }config.ini[user] name张三 age25 emailzhangsanexample.com [server] host192.168.1.100 port8080 timeout3000 [logging] enabledtrue leveldebug读到了但是中文部分是乱码。修改程序QSettings settings(configPath, QSettings::IniFormat); settings.setIniCodec(UTF-8);可以了继续修改使用相对路径QString configPath QCoreApplication::applicationDirPath() /config.ini; qDebug() configPath: configPath;构造函数QSettings(config.ini, QSettings::IniFormat)指定文件路径和格式。不指定格式时默认用注册表Windows或 plistmacOS读 INI 必须显式指定QSettings::IniFormat。键名规则INI 中的[section]变成section/key形式的扁平键如[user]下的name用user/name访问。返回 QVariantvalue()返回QVariant需要.toString()、.toInt()、.toBool()等转换。QSettings 会自动把true/false识别为布尔、纯数字识别为数值。提问如果组名为General,这时候我就读不到信息了为什么[General] localAddress192.168.68.1 peerAddress192.168.68.100 peerPort1234 localPort1235qDebug() localAddress settings.value(General/localAddress).toString();打印:localAddress 这是 QSettings 的一个特殊行为[General]是 QSettings 的保留组名。原因QSettings 把 INI 文件中的[General]组视为顶层无组前缀。也就是说[General] name张三 age25在 QSettings 看来这两个键没有组前缀读取方式是settings.value(name); // 正确 settings.value(General/name); // 错误读不到测试:const QStringList allKeys settings.allKeys(); for (const QString key : allKeys) { qDebug().noquote() key settings.value(key).toString(); }组为General时:localAddress 192.168.68.1localPort 1235peerAddress 192.168.68.100peerPort 1234组为info时:info/localAddress 192.168.68.1info/localPort 1235info/peerAddress 192.168.68.100info/peerPort 1234总结[General]是 QSettings 的约定等同于不属于任何组的顶层键如果你需要统一用组名/键名的方式访问避免使用General作为组名改用其他名称如[common]、[default]、[config]等即可