在写Qt应用程序时,程序中依赖配置文件,运行过程中会产生各种中间文件、缓存文件。应用程序需要一个环境配置,下面是我编写嵌入式设备的时候用的,仅限于单体架构的应用程序,部分核心代码已移除,请大家参考及提出宝贵意见。
文件中调用的类库在前面的文章中有,请大家好好查阅。
以下头文件在前面博文中都有源码提供。
quiutils.h
Singleton.h
iniutils.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
#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;
}