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

View File

@@ -0,0 +1,200 @@
#ifndef TABLEWIDGETFACTORY_H
#define TABLEWIDGETFACTORY_H
#include "../procedure/proceduredata.h"
#include <QDateTime>
#include <QMap>
#include <QObject>
#include <QString>
#include <QTableWidget>
#include <QVariant>
#include <QWidget>
/**
* @class TableWidgetFactory
* @brief 表格組件工廠類
*
* 根據 YAML 配置動態創建不同類型的表格組件:
* - Grid 表格:數據矩陣(行列形式)
* - Form 表格:表單字段佈局
* - Series 表格:時序數據記錄
*/
class TableWidgetFactory : public QObject
{
Q_OBJECT
public:
explicit TableWidgetFactory(QObject *parent = nullptr);
/**
* @brief 創建表格組件
* @param tableDef 表格定義
* @return 創建的表格組件
*/
QWidget *createTableWidget(const TableDefinition &tableDef);
// =====================================================
// Form 表格數據訪問
// =====================================================
/**
* @brief 設置字段值
* @param tableWidget 表格組件
* @param fieldId 字段ID
* @param value 值
* @return 是否成功
*/
bool setFieldValue(QWidget *tableWidget, const QString &fieldId, const QVariant &value);
/**
* @brief 獲取字段值
* @param tableWidget 表格組件
* @param fieldId 字段ID
* @return 字段值
*/
QVariant getFieldValue(QWidget *tableWidget, const QString &fieldId) const;
// =====================================================
// Grid 表格數據訪問
// =====================================================
/**
* @brief 設置單元格值
* @param tableWidget 表格組件
* @param rowId 行ID
* @param columnId 列ID
* @param value 值
* @return 是否成功
*/
bool setCellValue(QWidget *tableWidget, const QString &rowId,
const QString &columnId, const QVariant &value);
/**
* @brief 獲取單元格值
* @param tableWidget 表格組件
* @param rowId 行ID
* @param columnId 列ID
* @return 單元格值
*/
QVariant getCellValue(QWidget *tableWidget, const QString &rowId,
const QString &columnId) const;
// =====================================================
// 通用方法
// =====================================================
/**
* @brief 獲取表格定義
* @param tableWidget 表格組件
* @return 表格定義
*/
TableDefinition getTableDefinition(QWidget *tableWidget) const;
/**
* @brief 從引擎加載數據到表格
* @param tableWidget 表格組件
* @param tableRef 表格引用ID
* @param engineData 引擎數據
* @return 是否成功
*/
bool loadDataFromEngine(QWidget *tableWidget, const QString &tableRef,
const QVariantMap &engineData);
// =====================================================
// Series 表格特有方法
// =====================================================
/**
* @brief 添加時序數據點
* @param tableWidget 表格組件
* @param timestamp 時間戳
* @param fieldValues 字段值映射
* @return 是否成功
*/
bool addSeriesDataPoint(QWidget *tableWidget, const QDateTime &timestamp,
const QVariantMap &fieldValues);
/**
* @brief 清除時序數據
* @param tableWidget 表格組件
*/
void clearSeriesData(QWidget *tableWidget);
// =====================================================
// 驗證與控制
// =====================================================
/**
* @brief 驗證字段
* @param tableWidget 表格組件
* @param fieldId 字段ID
* @return 是否有效
*/
bool validateField(QWidget *tableWidget, const QString &fieldId) const;
/**
* @brief 啟用/禁用手動輸入
* @param tableWidget 表格組件
* @param enabled 是否啟用
*/
void enableManualInput(QWidget *tableWidget, bool enabled);
signals:
/**
* @brief 字段值變更信號Form 表格)
*/
void fieldValueChanged(QWidget *tableWidget, const QString &fieldId,
const QVariant &value);
/**
* @brief 單元格值變更信號Grid 表格)
*/
void cellValueChanged(QWidget *tableWidget, const QString &rowId,
const QString &columnId, const QVariant &value);
private:
// =====================================================
// 表格創建方法
// =====================================================
QWidget *createGridTable(const TableDefinition &tableDef);
QWidget *createFormTable(const TableDefinition &tableDef);
QWidget *createSeriesTable(const TableDefinition &tableDef);
// =====================================================
// 字段組件創建方法
// =====================================================
QWidget *createFieldWidget(const FieldDefinition &fieldDef, QWidget *parent);
QWidget *createNumericField(const FieldDefinition &fieldDef, QWidget *parent);
QWidget *createTextField(const FieldDefinition &fieldDef, QWidget *parent);
QWidget *createSelectionField(const FieldDefinition &fieldDef, QWidget *parent);
QWidget *createBooleanField(const FieldDefinition &fieldDef, QWidget *parent);
QWidget *createDateTimeField(const FieldDefinition &fieldDef, QWidget *parent);
QWidget *createCalculatedField(const FieldDefinition &fieldDef, QWidget *parent);
// =====================================================
// 輔助方法
// =====================================================
void connectFieldSignals(QWidget *fieldWidget, const QString &fieldId,
QWidget *tableWidget);
void applyStaticCells(QWidget *tableWidget, const TableDefinition &tableDef);
// =====================================================
// 內部數據結構
// =====================================================
struct TableWidgetData
{
TableDefinition definition;
QMap<QString, QWidget *> fieldWidgets; // fieldId -> widget (for form/series)
QTableWidget *gridWidget = nullptr; // for grid tables
QTableWidget *seriesWidget = nullptr; // for series tables
};
QMap<QWidget *, TableWidgetData> tableData;
};
#endif // TABLEWIDGETFACTORY_H