深入Qt--应用程序启动初始配置

深入Qt–应用程序启动初始配置

在写Qt应用程序时,程序中依赖配置文件,运行过程中会产生各种中间文件、缓存文件。应用程序需要一个环境配置,下面是我编写嵌入式设备的时候用的,仅限于单体架构的应用程序,部分核心代码已移除,请大家参考及提出宝贵意见。

文件中调用的类库在前面的文章中有,请大家好好查阅。

以下头文件在前面博文中都有源码提供。
quiutils.h
Singleton.h
iniutils.h

1.头文件 env.h

#ifndef ENV_H
#define ENV_H

#include 

#include "Singleton.h"

/**
 * @brief The env class 应用程序环境相关设置
 */
class env : public QObject
{
    Q_OBJECT
public:
    explicit env(QObject *parent = nullptr);

    /**
     * @brief init 应用程序初始化
     * @return
     */
    bool init();

    /**
     * @brief setDataPath
     * @param path
     */
    void setDataPath(QString path);

    /**
     * @brief checkOnly 检查程序是否 已经启动过
     * @return
     */
    bool checkOnly();

    /**
     * @brief isFirstRun 判断程序是否是第一次启动
     * @return
     */
    bool isFirstRun();

    /**
     * @brief reset 恢复出厂设置
     * @return
     */
    bool reset();

    /目录管理///
    /**
     * @brief getAppDir 获取存放应用程序目录
     * @return
     */
    QString getAppDir()
    {
        return m_AppPath;
    }
    
    /**
     * @brief getCacheDir 获取存放缓存数据目录
     * @return
     */
    QString getCacheDir()
    {
        return m_DataPath;
    }

    /**
     * @brief getBinaryDir 获取存放其他可执行文件路径
     * @return
     */
    QString getBinaryDir()
    {
        return m_AppPath + "/" + "bin";
    }

    /**
     * @brief getConfigDir 获取存放应用程序配置文件路径
     * @return
     */
    QString getConfigDir()
    {
        return m_DataPath + "/" + "conf";
    }

    /**
     * @brief getParaDir 获取存放参数文件路径
     * @return
     */
    QString getParaDir()
    {
        return m_DataPath + "/" + "para";
    }

    /**
     * @brief getDataDir 获取存放应用程序数据文件路径
     * @return
     */
    QString getDataDir()
    {
        return m_DataPath + "/" + "data";
    }

    /**
     * @brief getLogDir 获取存放应用程序日志文件路径
     * @return
     */
    QString getLogDir()
    {
        return m_DataPath + "/" + "log";
    }

    /**
     * @brief getDatabaseDir 获取存放数据库文件路径
     * @return
     */
    QString getDatabaseDir()
    {
        return m_DataPath + "/" + "db";
    }

    /**
     * @brief getBackupDir 获取存放应用程序上一个版本路径
     * @return
     */
    QString getBackupDir()
    {
        return m_DataPath + "/" + "backup";
    }

    /**
     * @brief getUpdateDir 获取存放更新程序路径
     * @return
     */
    QString getUpdateDir()
    {
        return m_DataPath + "/" + "update";
    }

    /**
     * @brief getFirmwareDir 获取存放固件程序路径
     * @return
     */
    QString getFirmwareDir()
    {
        return m_DataPath + "/" + "fw";
    }

    /**
     * @brief getCoreDataDir 获取存放默认数据路径
     * @return
     */
    QString getCoreDataDir()
    {
        return m_DataPath + "/" + "core";
    }

    /**
     * @brief getCoreDataDir 获取存放图片路径
     * @return
     */
    QString getImageDir()
    {
        return m_DataPath + "/" + "image";
    }

private:
    /**
     * @brief isDefaultPath 判断程序是否是默认路径
     * @return
     */
    bool isDefaultPath();

    /**
     * @brief newmWaferDir 判断程序是否存在相关目录,没有就创建
     */
    void newmWaferDir();

signals:

private:
    QString m_AppPath;       // 应用所在目录
    QString m_DataPath;      // 数据存储目录
};

typedef Singleton EnvMnr;

#define EnvPtr      EnvMnr::GetInstance()

#endif // ENV_H

源文件 env.cpp

#include 
#include 
#include 
#include 
#include "quiutils.h"
#include "iniutls/iniutils.h"
#include "env.h"

env::env(QObject *parent) : QObject(parent)
{
    m_AppPath = QCoreApplication::applicationDirPath();
    m_DataPath = QCoreApplication::applicationDirPath();
}

/**
 * @brief init 应用程序初始化
 * @return
 */
bool env::init()
{
    QString strVal = getAppDir() + "/" + "Config.ini";
    QString val = IniUtils::readConfig(strVal, "Path", "DataPath");
    if(!val.isEmpty())
    {
        m_DataPath = val;
    }

    newmWaferDir();
    return true;
}

void env::setDataPath(QString path)
{
    m_DataPath = path;
    QString strVal = getAppDir() + "/" + "Config.ini";
    IniUtils::writeConfig(strVal, "Path", "DataPath", path);
}

/**
 * @brief checkOnly 检查程序是否 已经启动过
 * @return
 */
bool env::checkOnly()
{
    QSystemSemaphore semaphore("APPKey", 1, QSystemSemaphore::Open);
    semaphore.acquire();

    QSharedMemory memory("APPLOCK");
    if(!memory.create(1))
    {
        semaphore.release();
        return true;
    }
    semaphore.release();
    return false;
}

/**
 * @brief isFirstRun 判断程序是否是第一次启动
 * @return
 */
bool env::isFirstRun()
{
    QString strVal = getAppDir() + "/" + "Config.ini";
    QString val = IniUtils::readConfig(strVal, "FirstRun", "firstRun");
    if(val.isEmpty() || val != "AA55AA55")
    {
        val = "AA55AA55";
        IniUtils::writeConfig(strVal, "FirstRun", "firstRun", val);
        return true;
    }
    return false;
}

/**
 * @brief reset 恢复出厂设置
 * @return
 */
bool env::reset()
{
    QString strVal = getAppDir() + "/" + "Config.ini";
    QString val = "";
    IniUtils::writeConfig(strVal, "FirstRun", "firstRun", val);
    return true;
}

/**
 * @brief isDefaultPath 判断程序是否是默认路径
 * @return
 */
bool env::isDefaultPath()
{
    return m_AppPath == QApplication::applicationDirPath();
}

/**
 * @brief newmWaferDir 判断程序是否存在相关目录,没有就创建
 */
void env::newmWaferDir()
{
    // 系统默认数据文件
    QUIUtils::newDir(m_DataPath);
    QUIUtils::newDir(getBinaryDir());
    QUIUtils::newDir(getConfigDir());
    QUIUtils::newDir(getBackupDir());
    QUIUtils::newDir(getCoreDataDir());
    QUIUtils::newDir(getDataDir());
    QUIUtils::newDir(getDatabaseDir());
    QUIUtils::newDir(getFirmwareDir());
    QUIUtils::newDir(getImageDir());
    QUIUtils::newDir(getLogDir());
    QUIUtils::newDir(getParaDir());
    QUIUtils::newDir(getUpdateDir());
}

应用

以下都是在main函数中程序启动时候调用。

// 判断程序是否已启动   这里不起作用,需把里面的值设为全局或放到main函数中。
if(EnvPtr->checkOnly())
{
    QMessageBox::information(0, "Tip", "NIBP_PCTest has been running!");
    return -1;
}

 // 判断程序是否是第一次启动
  if(EnvPtr->isFirstRun())
  {
      // 启动向导界面
      XWizard wizard;

      int nRet = wizard.exec();
      if(nRet == QDialog::Rejected)
      {
          EnvPtr->reset();
          return -1;
      }
  }

  // 初始化
  if(!EnvPtr->init())
  {
      QMessageBox::information(0, "Tip", "NIBP_PCTest init error!");
      return -1;
  }

你可能感兴趣的:(深入Qt,qt)