201 lines
6.1 KiB
C++
201 lines
6.1 KiB
C++
#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 ×tamp,
|
||
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
|