首页 > 解决方案 > 如何将不可编译的配置文件添加到 QT 项目中?

问题描述

我在 QT 项目中有一个 .txt 文件,其中存储了我的应用程序的设置参数。如果我这样读

void MainWindow::ReadApplicationSettings()
{
   QFile cfgFile("config.txt");
   if(!cfgFile.exists())
   {
      qDebug() << "Cannot find config file.";
   }
   else
   {
      ParseConfigFile(cfgFile);
      SetCfg();
   }
   cfgFile.close();
}

并解析它:

void MainWindow::ParseConfigFile(QFile &cfgFile)
{
    QString line;
    if (cfgFile.open(QIODevice::ReadOnly | QIODevice::Text))
    {
       QTextStream stream(&cfgFile);
       while (!stream.atEnd())
       {
          line = stream.readLine();
          std::istringstream iss(line.toStdString());
          std::string id, eq, val;
          bool error = false;

          if (!(iss >> id))
          {
            error = true;
          }  
          else if (id[0] == '#')
          {
            continue;
          }
          else if (!(iss >> eq >> val >> std::ws) || eq != "=" || iss.get() != EOF)
          {
            error = true;
          }
          if (error) { throw std::runtime_error("Parse error"); }

          cfgMap[id] = std::stoi(val);
     }
   }
}

文件存在,解析开始时文件内容为空

结果:line = stream.readLine(); 是 ””。

如果我像资源文件一样添加文件并以这种方式打开:

QFile cfgFile(":config.txt");

它工作正常,但问题是配置文件已编译,当您必须更改某些值时,必须重新构建项目才能生效

我试图像那样组成路径QDir::currentPath + "/config.txt",但效果不佳。

标签: c++qtconfigproject

解决方案


另一个选项是 Qt 5.6 中未记录的功能“file_copies”,您可以像这样使用它:

CONFIG += file_copies                                                                                                                                                              
configfiles.path = $$OUT_PWD                                                                                                                                                         
configfiles.files = $$PWD/config.txt                                                                                                                                              
COPIES += configfiles

在这里找到:https ://stackoverflow.com/a/54162789/6842395 如果您不喜欢这种方法,该帖子还有更多选项可供选择。

顺便说一句,看看你的ParseConfigFile()方法,你的 config.txt 似乎是一组行,格式为:key = value,非常类似于经典的 INI 文件。也许你可以像这样使用QSettings第三个构造函数:

QSettings settings("config.txt", QSettings::IniFormat);

推荐阅读