2025-08-20 23:06:28 +08:00
|
|
|
|
#include "ConfigFiles.h"
|
|
|
|
|
|
#include <QFile>
|
|
|
|
|
|
#include <QDebug>
|
2025-09-15 22:28:43 +08:00
|
|
|
|
#include <QFileInfo>
|
|
|
|
|
|
#include <QSettings>
|
2025-08-20 23:06:28 +08:00
|
|
|
|
ConfigFiles::ConfigFiles(QObject *parent) : QObject(parent)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
2025-10-14 20:05:38 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-10-20 22:28:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 读取配置值,若读取失败则使用默认值并写入配置文件
|
|
|
|
|
|
* @param group 配置组名
|
|
|
|
|
|
* @param key 配置项名
|
|
|
|
|
|
* @param defaultValue 读取失败时使用的默认值
|
|
|
|
|
|
* @return 读取到的值(或默认值)
|
|
|
|
|
|
*/
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
|
T ConfigFiles::readAndSetDefault(const QString &Path ,const QString& group, const QString& key, const T& defaultValue) {
|
|
|
|
|
|
// 检查配置文件是否存在
|
|
|
|
|
|
QSettings SystemConfig(Path, QSettings::IniFormat);
|
|
|
|
|
|
SystemConfig.setIniCodec("UTF-8"); // 尝试UTF-8编码
|
|
|
|
|
|
QFileInfo configCheck(Path);
|
|
|
|
|
|
bool fileExists = configCheck.exists() && configCheck.isFile();
|
|
|
|
|
|
|
|
|
|
|
|
// 读取配置值
|
|
|
|
|
|
SystemConfig.beginGroup(group);
|
|
|
|
|
|
QVariant value = SystemConfig.value(key);
|
|
|
|
|
|
SystemConfig.endGroup();
|
|
|
|
|
|
|
|
|
|
|
|
// 判断是否读取成功
|
|
|
|
|
|
if (fileExists && value.isValid()) {
|
|
|
|
|
|
// 读取成功,返回转换后的值
|
|
|
|
|
|
return value.value<T>();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 读取失败(文件不存在或键不存在),使用默认值并写入配置
|
|
|
|
|
|
if (isDebug) {
|
|
|
|
|
|
qDebug() << "配置项" << group << "/" << key << "读取失败,使用默认值:" << defaultValue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 写入默认值到配置文件
|
|
|
|
|
|
SystemConfig.beginGroup(group);
|
|
|
|
|
|
SystemConfig.setValue(key, defaultValue);
|
|
|
|
|
|
SystemConfig.endGroup();
|
|
|
|
|
|
SystemConfig.sync(); // 立即同步到文件
|
|
|
|
|
|
|
|
|
|
|
|
return defaultValue;
|
|
|
|
|
|
}
|
2025-10-14 20:05:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
void ConfigFiles::SystemConfig(){
|
2025-10-20 22:28:37 +08:00
|
|
|
|
|
2025-10-14 20:05:38 +08:00
|
|
|
|
QFileInfo checkFile("./ProgramConfig.ini");
|
|
|
|
|
|
QSettings File("./ProgramConfig.ini", QSettings::IniFormat);
|
|
|
|
|
|
if (checkFile.exists() && checkFile.isFile()) {
|
|
|
|
|
|
|
|
|
|
|
|
ConfigurationPath = File.value("System/ConfigurationPath").toString();
|
|
|
|
|
|
if(isDebug) qDebug()<<"配置文件路径:"<<ConfigurationPath;
|
|
|
|
|
|
}else{
|
|
|
|
|
|
qCritical()<<"未找到系统配置文件路径!";
|
|
|
|
|
|
File.setValue("System/ConfigurationPath","./");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QString Path = ConfigurationPath + "系统配置/SystemConfig.ini";
|
2025-10-20 22:28:37 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 读取刷新时间配置,失败时自动写入默认值10
|
|
|
|
|
|
TrailRefreshTime = readAndSetDefault(Path,"RefreshTime", "TrailRefreshTime(s)", 10);
|
|
|
|
|
|
|
|
|
|
|
|
// 读取UI刷新时间,失败时自动写入默认值100
|
|
|
|
|
|
UIRefreshTime = readAndSetDefault(Path,"RefreshTime", "UIRefreshTime(ms)", 100);
|
|
|
|
|
|
|
|
|
|
|
|
// 读取RTSP地址,失败时自动写入默认URL
|
|
|
|
|
|
RTSP_Url = readAndSetDefault(Path,"System", "RTSP_Url", QString("rtsp://admin:sshw1212@192.168.1.64:554/Streaming/Channels/101")
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// 读取页面名称-按钮名称
|
|
|
|
|
|
QString AllPage = readAndSetDefault(Path,"PageName","AllPage",QString("P01#P02#P03#P04#P05#P06#P07#P08#P09#P10#P11#P12.0#P12.1#P12.2#P12.3#P12.4#P12.5#P12.6#P12.7#P12.8#P12.9#P13#P14#P15#P16"));
|
|
|
|
|
|
QStringList Pages = AllPage.split('#',Qt::SkipEmptyParts); // 忽略空段
|
|
|
|
|
|
QStringList PageNmaes={"主预览","屏蔽条件","油泵设备","截割设备","装载设备","运输设备","液压设备","故障记录","遥控测试","腔内监控","绝缘检测","网络拓扑","IOX1","IOX2","阀控1","电流模块","油质信息","PLC箱1","PLC箱2","PLC箱3","PLC箱4","本地控制","随机图册","参数设置","系统设置"};
|
|
|
|
|
|
uint8_t i=0;
|
|
|
|
|
|
for (const QString &page : Pages){
|
|
|
|
|
|
gPageName[page] = readAndSetDefault(Path,"PageName",page,QString(PageNmaes[i]));
|
|
|
|
|
|
i++;
|
2025-10-14 20:05:38 +08:00
|
|
|
|
}
|
2025-08-20 23:06:28 +08:00
|
|
|
|
}
|
2025-10-20 22:28:37 +08:00
|
|
|
|
|
2025-09-15 22:28:43 +08:00
|
|
|
|
tsServerAddr ConfigFiles::ReadServerAddr(){
|
|
|
|
|
|
tsServerAddr SAddr;
|
2025-10-14 20:05:38 +08:00
|
|
|
|
QString Path = ConfigurationPath + "OpcUa配置/OpcUa_ServerConfig.ini";
|
|
|
|
|
|
qDebug()<<"OpcUa服务配置文件路径:"<<Path;
|
2025-09-15 22:28:43 +08:00
|
|
|
|
// 检查文件是否存在
|
2025-10-14 20:05:38 +08:00
|
|
|
|
QFileInfo checkFile(Path);
|
2025-09-15 22:28:43 +08:00
|
|
|
|
// 创建QSettings对象,指定INI文件路径
|
2025-10-14 20:05:38 +08:00
|
|
|
|
QSettings File(Path, QSettings::IniFormat);
|
2025-09-15 22:28:43 +08:00
|
|
|
|
if (checkFile.exists() && checkFile.isFile()) {
|
|
|
|
|
|
// 如果文件已经存在
|
|
|
|
|
|
SAddr.Host = File.value("PLC_Server/Host").toString();
|
|
|
|
|
|
SAddr.UserName = File.value("PLC_Server/UserName").toString();
|
|
|
|
|
|
SAddr.Passwd = File.value("PLC_Server/Password").toString();
|
2025-10-14 20:05:38 +08:00
|
|
|
|
qDebug()<<"读取到的PLC 地址配置:"<<SAddr.Host<<" 用户名:"<<SAddr.UserName<<" 密码:"<<SAddr.Passwd;
|
2025-09-15 22:28:43 +08:00
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 如果文件不存在
|
|
|
|
|
|
File.setValue("PLC_Server/Host", SAddr.Host);
|
|
|
|
|
|
File.setValue("PLC_Server/UserName", SAddr.UserName);
|
|
|
|
|
|
File.setValue("PLC_Server/Password", SAddr.Passwd);
|
2025-10-14 20:05:38 +08:00
|
|
|
|
qDebug()<<"写配置文件 地址配置:"<<SAddr.Host<<" 用户名:"<<SAddr.UserName<<" 密码:";
|
2025-09-15 22:28:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return SAddr;
|
|
|
|
|
|
}
|
2025-08-20 23:06:28 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief ReadFile_Csv 读取 CSV 文件,返回行列表
|
|
|
|
|
|
* @param &filePath CSV 文件路径
|
|
|
|
|
|
* @return QList<QStringList> 每个 QStringList 为一行的字段
|
|
|
|
|
|
*/
|
|
|
|
|
|
QList<QStringList> ConfigFiles::ReadFile_Csv(const QString &filePath){
|
|
|
|
|
|
QList<QStringList> rows;
|
|
|
|
|
|
|
|
|
|
|
|
QFile file(filePath);
|
2025-09-28 17:14:34 +08:00
|
|
|
|
QFileInfo testFile(filePath);
|
2025-08-20 23:06:28 +08:00
|
|
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
|
|
|
|
|
{
|
2025-09-28 17:14:34 +08:00
|
|
|
|
qWarning() << "CSV 打开失败:" << file.errorString()<<testFile.absoluteFilePath();
|
2025-08-20 23:06:28 +08:00
|
|
|
|
return rows;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-14 20:05:38 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-08-20 23:06:28 +08:00
|
|
|
|
QTextStream in(&file);
|
2025-09-15 22:28:43 +08:00
|
|
|
|
#if defined(Q_OS_LINUX) // 判断操作系统是否为Linux
|
|
|
|
|
|
in.setCodec("GBK"); // 如有需要可改成 "GBK"
|
|
|
|
|
|
#elif defined(Q_OS_WIN) // 判断操作系统是否为Windows
|
|
|
|
|
|
|
|
|
|
|
|
#else // 如果不是Linux也不是Windows
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2025-08-20 23:06:28 +08:00
|
|
|
|
|
|
|
|
|
|
QStringList currentRow;
|
|
|
|
|
|
QString currentField;
|
|
|
|
|
|
bool inQuote = false;
|
|
|
|
|
|
|
|
|
|
|
|
while (!in.atEnd())
|
|
|
|
|
|
{
|
|
|
|
|
|
QString line = in.readLine();
|
|
|
|
|
|
|
|
|
|
|
|
// 处理跨行引号:如果上一行未闭合,继续拼
|
|
|
|
|
|
if (inQuote)
|
|
|
|
|
|
currentField += "\n";
|
|
|
|
|
|
else
|
|
|
|
|
|
currentField.clear();
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < line.size(); ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
QChar ch = line.at(i);
|
|
|
|
|
|
|
|
|
|
|
|
if (ch == '\"')
|
|
|
|
|
|
{
|
|
|
|
|
|
// 连续两个引号表示转义
|
|
|
|
|
|
if (i + 1 < line.size() && line.at(i + 1) == '\"')
|
|
|
|
|
|
{
|
|
|
|
|
|
currentField += '\"';
|
|
|
|
|
|
++i; // 跳过下一个引号
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
inQuote = !inQuote;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (ch == ',' && !inQuote)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 字段结束
|
|
|
|
|
|
currentRow << currentField.trimmed();
|
|
|
|
|
|
currentField.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
currentField += ch;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果引号已闭合,把最后一列也加入并结束本行
|
|
|
|
|
|
if (!inQuote)
|
|
|
|
|
|
{
|
|
|
|
|
|
currentRow << currentField.trimmed();
|
|
|
|
|
|
rows << currentRow;
|
|
|
|
|
|
currentRow.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果文件结尾时引号未闭合,把剩余部分作为最后一列
|
|
|
|
|
|
if (!currentField.isEmpty() || !currentRow.isEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
currentRow << currentField.trimmed();
|
|
|
|
|
|
rows << currentRow;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
file.close();
|
2025-10-14 20:05:38 +08:00
|
|
|
|
//qDebug() << "CSV 打开成功:" << file.errorString()<<testFile.absoluteFilePath()<<rows;
|
2025-08-20 23:06:28 +08:00
|
|
|
|
return rows;
|
|
|
|
|
|
}
|