我正在使用文件支持的QSettings
对象写入和读取字符串和int值。
当我稍后尝试从不同的进程读取值时,这些值被读取为字符串而不是整数。
这是我用来写入值的代码:
QSettings settings("TestQSettings.ini", QSettings::IniFormat);
settings.setValue("AAA",QString("111"));
settings.setValue("BBB",222);
这是创建的文件:
[General]
AAA=111
BBB=222
这是我用来读取值的代码:
QVariant qvar = settings.value("AAA");
std::cout << "AAA type " << qvar.type() << std::endl;
qvar = settings.value("BBB");
std::cout << "BBB type " << qvar.type() << std::endl;
如果我从同一进程运行此代码:
AAA type 10
BBB type 2
如果我从不同的进程运行此代码:
AAA type 10
BBB type 10
我知道在读取类型后可以对其进行转换。
不幸的是,这个解决方案需要修改 Windows 遗留的跨平台代码,但我不喜欢修改,例如多次调用 RegQueryValueEx()
。
是否可以存储和读取字符串和整数的类型信息?
例如,字符串将有引号 ""
而整数则不会:
[General]
AAA="111"
BBB=222
这个问题在 Linux 上的 Qt 4 和 Qt 5 上都存在。
最佳答案
哇哦,你使用的是 .ini 文件还是注册表?
对于 .ini 文件,显然不可能知道类型是什么,因为它都是字符串。您可以尝试将变体转换为整数(不要使用canConvert
!),并在转换为 1 时假定它是整数。
通过注册表,QSettings
将按照您的预期工作。
我真的不明白问题出在哪里。如果您希望保留类型信息,请不要使用 .ini
文件。如果您以依赖于平台的方式手动编写代码,您将面临完全相同的问题。
您可以将带引号的字符串显式写入 .ini
文件中,并在读回它们时检查是否存在引号。如果引号不存在,您可以尝试转换为整数。
关于c++ - QSettings 不区分字符串和整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19355112/