Как добавить не компилируемый файл конфигурации в QT Project? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть файл .txt в проекте QT, где я храню параметры настройки для моего приложения. Если я прочитаю его таким образом

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 ();is "".

Если я добавлю файл как файл ресурсов и открою его следующим образом:

QFile cfgFile(":config.txt");

Это работает правильно, но проблемачто файл конфигурации скомпилирован и когда вам нужно изменить какое-то значение, проект должен быть перестроен, чтобы вступить в силу

Я попытался составить путь таким образом QDir::currentPath + "/config.txt", но не работает.

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Еще одна опция - недокументированная функция "file_copies" в Qt 5.6, которую вы можете использовать следующим образом:

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

Найдено здесь: https://stackoverflow.com/a/54162789/6842395 Если вам не нравится этот метод, этоУ post есть еще несколько вариантов выбора.

Кстати, обход вашего метода ParseConfigFile() кажется, что ваш config.txt представляет собой набор строк с форматом: ключ = значение, очень похожий на классический INIфайл. Может быть, вы могли бы использовать QSettings третий конструктор, как это:

QSettings settings("config.txt", QSettings::IniFormat);
1 голос
/ 23 октября 2019

Вы можете использовать QMAKE_EXTRA_TARGET в своем профиле, например:

copyfile.commands += $${QMAKE_COPY} $$system_path($$PWD/config.txt) $$system_path($$DESTDIR/)
first.depends = $(first) copyfile
QMAKE_EXTRA_TARGETS += first copyfile

Но убедитесь, что ваш $$ DESTDIR правильный.

...