first commit

This commit is contained in:
2026-01-02 19:20:35 +09:00
commit a10cb30c4a
94 changed files with 28609 additions and 0 deletions

382
utils/configmanager.cpp Normal file
View File

@@ -0,0 +1,382 @@
#include "configmanager.h"
#include <QFile>
#include <QDebug>
ConfigManager::ConfigManager(QObject *parent)
: QObject(parent)
{
}
ConfigManager::~ConfigManager()
{
}
bool ConfigManager::loadFromFile(const QString &filePath)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly))
{
qWarning() << "Cannot open config file:" << filePath;
return false;
}
QByteArray data = file.readAll();
file.close();
QJsonParseError error;
m_configDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError)
{
qWarning() << "JSON parse error:" << error.errorString();
return false;
}
m_config = m_configDoc.object();
return true;
}
bool ConfigManager::loadDefaultConfig()
{
// 默认配置 - 基于需求规格
QString defaultConfig = R"({
"name": "智能校验仪启动器",
"version": "1.0.0",
"colorSystem": {
"primary": "#2196F3",
"accent": "#FF9800",
"success": "#4CAF50",
"warning": "#FFC107",
"danger": "#F44336",
"background": "#F5F5F5"
},
"pages": [
{
"id": "page1",
"title": "信号输出和测量",
"apps": [
{
"id": "rtd",
"name": "热电阻",
"nameEn": "RTD",
"color": "#2196F3",
"gradient": ["#2196F3", "#1976D2"],
"badge": "Ω",
"description": "2/3/4线热电阻测量PT100模拟输出",
"features": ["测量2/3/4线热电阻阻值", "自动计算线电阻", "自动转换为温度", "PT100分度表模拟输出"]
},
{
"id": "thermocouple",
"name": "热电偶",
"nameEn": "TC",
"color": "#FF9800",
"gradient": ["#FF9800", "#F57C00"],
"badge": "mV",
"description": "热电偶电压测量,分度表模拟输出"
},
{
"id": "insulation",
"name": "绝缘电阻",
"nameEn": "Insulation",
"color": "#F44336",
"gradient": ["#F44336", "#D32F2F"],
"badge": "",
"description": "50V/100V绝缘电阻测量",
"warning": true
},
{
"id": "dc_current",
"name": "直流电流",
"nameEn": "DC Current",
"color": "#4CAF50",
"gradient": ["#4CAF50", "#388E3C"],
"badge": "mA",
"description": "0-20mA电流输出/测量"
},
{
"id": "dc_voltage",
"name": "直流电压",
"nameEn": "DC Voltage",
"color": "#9C27B0",
"gradient": ["#9C27B0", "#7B1FA2"],
"badge": "V",
"description": "0-20V电压输出/测量"
},
{
"id": "frequency",
"name": "频率信号",
"nameEn": "Frequency",
"color": "#00BCD4",
"gradient": ["#00BCD4", "#0097A7"],
"badge": "Hz",
"description": "转速测量,方波/正弦波输出"
},
{
"id": "ac_voltage",
"name": "交流电压",
"nameEn": "AC Voltage",
"color": "#E91E63",
"gradient": ["#E91E63", "#C2185B"],
"badge": "VAC",
"description": "220VAC测量功能",
"warning": true
}
]
},
{
"id": "page2",
"title": "信号检测功能",
"apps": [
{
"id": "switch_detect",
"name": "开关量检测",
"nameEn": "Switch Detect",
"color": "#795548",
"gradient": ["#795548", "#5D4037"],
"badge": "SW",
"description": "电阻通断/电压判断开关状态"
},
{
"id": "ripple",
"name": "纹波诊断",
"nameEn": "Ripple Diagnosis",
"color": "#FF5722",
"gradient": ["#FF5722", "#E64A19"],
"badge": "AI",
"description": "电源纹波检测AI故障诊断"
},
{
"id": "ramp",
"name": "斜波输出",
"nameEn": "Ramp Output",
"color": "#3F51B5",
"gradient": ["#3F51B5", "#303F9F"],
"badge": "",
"description": "可设速率的斜波信号输出"
},
{
"id": "waveform",
"name": "波形采集",
"nameEn": "Waveform Capture",
"color": "#009688",
"gradient": ["#009688", "#00796B"],
"badge": "REC",
"description": "信号采集记录≤25ms/点"
},
{
"id": "dual_channel",
"name": "双通道",
"nameEn": "Dual Channel",
"color": "#673AB7",
"gradient": ["#673AB7", "#512DA8"],
"badge": "2CH",
"description": "同时输出2路采集2路信号"
},
{
"id": "trim",
"name": "信号微调",
"nameEn": "Signal Trim",
"color": "#607D8B",
"gradient": ["#607D8B", "#455A64"],
"badge": "±",
"description": "任意位数信号微调"
}
]
},
{
"id": "page3",
"title": "系统和通讯",
"apps": [
{
"id": "data_management",
"name": "数据管理",
"nameEn": "Data Management",
"color": "#8BC34A",
"gradient": ["#8BC34A", "#689F38"],
"badge": "📁",
"description": "数据存储、导出、搜索"
},
{
"id": "wireless",
"name": "无线通讯",
"nameEn": "Wireless",
"color": "#03A9F4",
"gradient": ["#03A9F4", "#0288D1"],
"badge": "4G",
"description": "4G/WIFI通讯设置"
},
{
"id": "sop",
"name": "规程管理",
"nameEn": "SOP",
"color": "#CDDC39",
"gradient": ["#CDDC39", "#AFB42B"],
"badge": "📋",
"description": "自动化校验流程"
},
{
"id": "rcp63",
"name": "RCP63",
"nameEn": "RCP63",
"color": "#2196F3",
"gradient": ["#2196F3", "#1976D2"],
"badge": "🌐",
"description": "RCP63协议通讯"
},
{
"id": "settings",
"name": "系统设置",
"nameEn": "Settings",
"color": "#9E9E9E",
"gradient": ["#9E9E9E", "#757575"],
"badge": "⚙️",
"description": "系统参数配置"
}
]
}
],
"dock": [
{
"id": "dock_sop",
"name": "规程",
"color": "#CDDC39",
"gradient": ["#CDDC39", "#AFB42B"]
},
{
"id": "dock_rcp63",
"name": "RCP63",
"color": "#2196F3",
"gradient": ["#2196F3", "#1976D2"]
},
{
"id": "dock_network",
"name": "网络测试",
"color": "#03A9F4",
"gradient": ["#03A9F4", "#0288D1"]
},
{
"id": "dock_settings",
"name": "系统设置",
"color": "#9E9E9E",
"gradient": ["#9E9E9E", "#757575"]
}
],
"animations": {
"pageTransition": {
"duration": 300,
"easing": "ease-out"
},
"iconPress": {
"scale": 0.95,
"duration": 100
}
}
})";
QJsonParseError error;
m_configDoc = QJsonDocument::fromJson(defaultConfig.toUtf8(), &error);
if (error.error != QJsonParseError::NoError)
{
qWarning() << "Default config parse error:" << error.errorString();
return false;
}
m_config = m_configDoc.object();
return true;
}
bool ConfigManager::saveToFile(const QString &filePath)
{
QFile file(filePath);
if (!file.open(QIODevice::WriteOnly))
{
qWarning() << "Cannot write config file:" << filePath;
return false;
}
file.write(m_configDoc.toJson(QJsonDocument::Indented));
file.close();
return true;
}
QVector<PageConfig> ConfigManager::getPages() const
{
QVector<PageConfig> pages;
QJsonArray pagesArray = m_config["pages"].toArray();
for (const QJsonValue &pageVal : pagesArray)
{
pages.append(parsePageConfig(pageVal.toObject()));
}
return pages;
}
QVector<AppIconData> ConfigManager::getDockApps() const
{
QVector<AppIconData> apps;
QJsonArray dockArray = m_config["dock"].toArray();
for (const QJsonValue &appVal : dockArray)
{
apps.append(parseAppData(appVal.toObject()));
}
return apps;
}
QJsonObject ConfigManager::getColorSystem() const
{
return m_config["colorSystem"].toObject();
}
QJsonObject ConfigManager::getAnimations() const
{
return m_config["animations"].toObject();
}
AppIconData ConfigManager::parseAppData(const QJsonObject &obj) const
{
AppIconData data;
data.id = obj["id"].toString();
data.name = obj["name"].toString();
data.nameEn = obj["nameEn"].toString();
data.icon = obj["icon"].toString();
data.color = obj["color"].toString();
data.badge = obj["badge"].toString();
data.group = obj["group"].toString(); // 解析分组标识
data.description = obj["description"].toString();
data.warning = obj["warning"].toBool(false);
// 解析渐变色
QJsonArray gradientArray = obj["gradient"].toArray();
for (const QJsonValue &val : gradientArray)
{
data.gradient.append(val.toString());
}
// 解析功能列表
QJsonArray featuresArray = obj["features"].toArray();
for (const QJsonValue &val : featuresArray)
{
data.features.append(val.toString());
}
return data;
}
PageConfig ConfigManager::parsePageConfig(const QJsonObject &obj) const
{
PageConfig config;
config.id = obj["id"].toString();
config.title = obj["title"].toString();
QJsonArray appsArray = obj["apps"].toArray();
for (const QJsonValue &appVal : appsArray)
{
config.apps.append(parseAppData(appVal.toObject()));
}
return config;
}

37
utils/configmanager.h Normal file
View File

@@ -0,0 +1,37 @@
#ifndef CONFIGMANAGER_H
#define CONFIGMANAGER_H
#include <QObject>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QVector>
#include "../widgets/appicon.h"
#include "../widgets/launcherpage.h"
class ConfigManager : public QObject
{
Q_OBJECT
public:
explicit ConfigManager(QObject *parent = nullptr);
~ConfigManager();
bool loadFromFile(const QString &filePath);
bool loadDefaultConfig();
bool saveToFile(const QString &filePath);
QVector<PageConfig> getPages() const;
QVector<AppIconData> getDockApps() const;
QJsonObject getColorSystem() const;
QJsonObject getAnimations() const;
private:
AppIconData parseAppData(const QJsonObject &obj) const;
PageConfig parsePageConfig(const QJsonObject &obj) const;
QJsonDocument m_configDoc;
QJsonObject m_config;
};
#endif // CONFIGMANAGER_H

286
utils/stylehelper.cpp Normal file
View File

@@ -0,0 +1,286 @@
#include "stylehelper.h"
void StyleHelper::applyGlobalStyle(QApplication *app)
{
app->setStyleSheet(getGlobalStyleSheet());
}
QString StyleHelper::getGlobalStyleSheet()
{
return R"(
/* 全局样式 */
QWidget {
font-family: "Source Han Sans SC", "Noto Sans SC", "Microsoft YaHei", sans-serif;
}
/* 主窗口 */
QMainWindow {
background-color: #F5F5F5;
}
/* 按钮样式 - 触摸屏优化 */
QPushButton {
background-color: #2196F3;
color: white;
border: none;
border-radius: 8px;
padding: 10px 20px;
font-size: 14px;
font-weight: 500;
min-height: 38px;
}
QPushButton:hover {
background-color: #1976D2;
}
QPushButton:pressed {
background-color: #1565C0;
}
QPushButton:disabled {
background-color: #BDBDBD;
color: #757575;
}
/* 次要按钮 */
QPushButton[flat="true"] {
background-color: transparent;
color: #2196F3;
}
QPushButton[flat="true"]:hover {
background-color: rgba(33, 150, 243, 0.1);
}
/* 输入框 - 触摸屏优化 */
QLineEdit {
background-color: white;
border: 1px solid #E0E0E0;
border-radius: 8px;
padding: 10px 14px;
font-size: 14px;
color: #212121;
min-height: 38px;
}
QLineEdit:focus {
border-color: #2196F3;
border-width: 2px;
}
QLineEdit:disabled {
background-color: #FAFAFA;
color: #9E9E9E;
}
/* 下拉框 - 触摸屏优化 */
QComboBox {
background-color: white;
border: 1px solid #E0E0E0;
border-radius: 8px;
padding: 10px 14px;
font-size: 14px;
color: #212121;
min-height: 38px;
}
QComboBox:hover {
border-color: #BDBDBD;
}
QComboBox:focus {
border-color: #2196F3;
}
QComboBox::drop-down {
border: none;
width: 40px;
}
QComboBox::down-arrow {
image: url(:/icons/arrow_down.svg);
width: 16px;
height: 16px;
}
/* 滚动条 - 触摸屏优化 */
QScrollBar:vertical {
background-color: #F5F5F5;
width: 14px;
border-radius: 7px;
}
QScrollBar::handle:vertical {
background-color: #BDBDBD;
border-radius: 7px;
min-height: 50px;
}
QScrollBar::handle:vertical:hover {
background-color: #9E9E9E;
}
QScrollBar::add-line:vertical,
QScrollBar::sub-line:vertical {
height: 0px;
}
QScrollBar:horizontal {
background-color: #F5F5F5;
height: 14px;
border-radius: 7px;
}
QScrollBar::handle:horizontal {
background-color: #BDBDBD;
border-radius: 7px;
min-width: 50px;
}
QScrollBar::handle:horizontal:hover {
background-color: #9E9E9E;
}
QScrollBar::add-line:horizontal,
QScrollBar::sub-line:horizontal {
width: 0px;
}
/* 标签页 */
QTabWidget::pane {
border: 1px solid #E0E0E0;
border-radius: 8px;
background-color: white;
}
QTabBar::tab {
background-color: #F5F5F5;
color: #757575;
padding: 12px 24px;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
margin-right: 2px;
}
QTabBar::tab:selected {
background-color: white;
color: #2196F3;
font-weight: 500;
}
QTabBar::tab:hover:!selected {
background-color: #EEEEEE;
}
/* 进度条 */
QProgressBar {
background-color: #E0E0E0;
border: none;
border-radius: 4px;
height: 8px;
text-align: center;
}
QProgressBar::chunk {
background-color: #2196F3;
border-radius: 4px;
}
/* 工具提示 */
QToolTip {
background-color: #424242;
color: white;
border: none;
border-radius: 4px;
padding: 8px 12px;
font-size: 12px;
}
/* 消息框 */
QMessageBox {
background-color: white;
}
QMessageBox QLabel {
color: #212121;
font-size: 14px;
}
/* 分组框 */
QGroupBox {
background-color: white;
border: 1px solid #E0E0E0;
border-radius: 8px;
margin-top: 16px;
padding: 16px;
font-weight: 500;
}
QGroupBox::title {
subcontrol-origin: margin;
subcontrol-position: top left;
left: 16px;
padding: 0 8px;
color: #424242;
}
/* 列表 */
QListWidget {
background-color: white;
border: 1px solid #E0E0E0;
border-radius: 8px;
padding: 8px;
}
QListWidget::item {
padding: 12px;
border-radius: 4px;
}
QListWidget::item:selected {
background-color: #E3F2FD;
color: #1976D2;
}
QListWidget::item:hover:!selected {
background-color: #F5F5F5;
}
/* 表格 */
QTableWidget {
background-color: white;
border: 1px solid #E0E0E0;
border-radius: 8px;
gridline-color: #EEEEEE;
}
QTableWidget::item {
padding: 12px;
}
QTableWidget::item:selected {
background-color: #E3F2FD;
color: #1976D2;
}
QHeaderView::section {
background-color: #FAFAFA;
color: #424242;
padding: 12px;
border: none;
border-bottom: 1px solid #E0E0E0;
font-weight: 500;
}
)";
}
QString StyleHelper::cardShadow()
{
return "0 4px 8px rgba(0,0,0,0.15)";
}
QString StyleHelper::buttonShadow()
{
return "0 2px 4px rgba(0,0,0,0.2)";
}

32
utils/stylehelper.h Normal file
View File

@@ -0,0 +1,32 @@
#ifndef STYLEHELPER_H
#define STYLEHELPER_H
#include <QApplication>
#include <QString>
class StyleHelper
{
public:
static void applyGlobalStyle(QApplication *app);
static QString getGlobalStyleSheet();
// 颜色获取
static QString primaryColor() { return "#2196F3"; }
static QString accentColor() { return "#FF9800"; }
static QString successColor() { return "#4CAF50"; }
static QString warningColor() { return "#FFC107"; }
static QString dangerColor() { return "#F44336"; }
static QString backgroundColor() { return "#F5F5F5"; }
static QString surfaceColor() { return "#FFFFFF"; }
static QString textPrimaryColor() { return "#212121"; }
static QString textSecondaryColor() { return "#757575"; }
// 阴影样式
static QString cardShadow();
static QString buttonShadow();
private:
StyleHelper() = default;
};
#endif // STYLEHELPER_H