Files
CalibratorLauncher/widgets/tablewidgetfactory.h
2026-01-02 19:20:35 +09:00

201 lines
6.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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