Как мне сказать Qt Creator запустить мой генератор кода для генерации файлов xxx.h и xxx.cpp из файла xxx.txt? - PullRequest
0 голосов
/ 25 апреля 2019

Я написал программу для генерации кода на C ++ для кода, которая обеспечивает доступ к таблицам Sql в QT. Генератор берет простой текстовый файл и создает файл заголовка класса (.h) и пару файлов определения класса (.cpp). Все файлы известны QT Creator в моем проекте (и находятся под контролем версий).

Я хочу, чтобы мой генератор кода работал при изменении входного текстового файла. Затем я бы заново сгенерировал соответствующие ему файлы .h и .cpp. Затем сборка автоматически скомпилирует файл .cpp при сборке.

Я не знаю, как включить мой генератор кода в процесс сборки QT Creator (cmake). Кто-нибудь может мне помочь?

Я могу запустить процесс вручную, выбрав каждый входной текстовый файл и поместив его в программу. Это возможность добавить шаг сборки в QT Creator. Я добавил свою программу в качестве «Пользовательского шага процесса», но она не выбирает каждый входной текстовый файл и использует зависимости для принятия решения о запуске или нет.

Типичный текстовый файл ввода выглядит так:

tablename=filepathtable,FP,dbt_filepath
filepath_id INTEGER PRIMARY KEY
drive_letter TEXT
file_path TEXT
full_path TEXT

Генератор кода создает заголовочный файл следующим образом:

#ifndef DBT_FILEPATH_H
#define DBT_FILEPATH_H

// DO NOT EDIT THIS FILE! File was generated by dbtable_qt.ahk

#include "dbmanager.h"
#include <QString>
#include <QSqlQuery>
#include <QSqlError>

class Dbt_Filepath
{
public:
    Dbt_Filepath(QSqlDatabase* p_db);
    bool createFPTable();
    bool insertFPTable();
  bool queryFPTablePrimaryKey(int p_filepath_id);

    void debugShowSqlQueryError(const QLatin1String& funcname,
                                QSqlQuery& query);
    const QString getTableName();

    // database table fields
    int filepath_id;
    QString drive_letter;
    QString file_path;
    QString full_path;
    enum eFP_dbcol{
          field_filepath_id=0,
          field_drive_letter,
          field_file_path,
          field_full_path };

    // private data and functions
private:
    QSqlDatabase* m_db;    // database
    void fillFieldsFromQuery(QSqlQuery& query);

};

#endif    // DBT_FILEPATH_H

и файл .cpp, подобный этому (показан частично):

// DO NOT EDIT THIS FILE! File was generated by dbtable_qt.ahk

#include <QDebug>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include "dbt_filepath.h"

Dbt_Filepath::Dbt_Filepath(QSqlDatabase* p_db)
 : m_db(p_db)
{
}

const QString Dbt_Filepath::getTableName()
{
     const QString tblnm = QLatin1String("filepathtable");
     return tblnm;
}

bool Dbt_Filepath::createFPTable()
{
  bool success = false;
  const QLatin1String fname("DFP::createFPTable()");
  qDebug() << fname;
  QSqlQuery querycreate(*m_db);
  QString sqlcreate = QLatin1String(
          "CREATE TABLE filepathtable ("
          "filepath_id INTEGER PRIMARY KEY,"
          "drive_letter TEXT,"
          "file_path TEXT,"
          "full_path TEXT"
          ");"  );

  querycreate.prepare(sqlcreate);
  if (querycreate.exec())
    success = true;
  else
    debugShowSqlQueryError(fname, querycreate);
  return success;
}

bool Dbt_Filepath::insertFPTable()
{
  bool success = false;
  const QLatin1String fname("DFP::insertFPTable()");
  qDebug() << fname;
  QSqlQuery queryinsert(*m_db);
  QString sqlinsert = QLatin1String(
"INSERT INTO filepathtable ("
          "drive_letter,"
          "file_path,"
          "full_path"

           ") VALUES(?,?,?);");
  queryinsert.prepare(sqlinsert);
  queryinsert.addBindValue(drive_letter.toUtf8());
...

Я хочу, чтобы процесс сборки использовал исходные текстовые файлы в качестве источников - перед компиляцией чего-либо - для повторной генерации файлов c ++, если это необходимо. Затем я хочу выполнить обычный процесс сборки, чтобы продолжить компиляцию и связывание моего кода.

...