qsettings不同的结果

时间:2010-02-18 20:29:38

标签: c++ qt

我正在使用QSettings来尝试确定INI是否有效。(使用status()来检查)我做了一个故意无效的INI文件并将其加载。第一次调用代码时,它返回invalid,但每次之后,它返回有效。这是我代码中的错误吗?

2 个答案:

答案 0 :(得分:1)

这是一个全球状态导致的 Qt bug 。请注意,无论您是否在QSettings对象上调用delete,都会发生结果差异。以下是第一次运行时所发生情况的简要总结:

  1. 结果代码设置为NoError
  2. 检查全局缓存以查看您的文件是否存在
  3. 您的文件第一次不存在,因此会在qsettings.cpp第1530行(Qt-4.6.2)进行解析
  4. 解析会导致错误并设置结果代码(请参阅qsettings.cpp第1552行)。
  5. 返回错误结果代码。
  6. 第二轮不同:

    1. 结果代码设置为NoError
    2. 检查全局缓存,您的文件存在。
    3. 检查文件大小和时间戳以查看文件是否已更改(请参阅qsettings.cpp第1424行)。
    4. 返回结果代码,恰好是NoError - 假定文件已被正确解析。

答案 1 :(得分:0)

检查您的代码,您需要在返回之前删除文件对象。

除此之外,您的代码使用QSettings::QSettings(fileName, format) c'tor打开ini文件。该调用以函数QConfFile::fromName结尾(在qsettings.cpp中实现)。当我读它(有一些宏,我决定不遵循),如果文件已经打开(即你上次没有删除对象),文件不会重新打开。因此,状态第二次就可以了。