#ifndef TABLEWIDGETFACTORY_H #define TABLEWIDGETFACTORY_H #include "../procedure/proceduredata.h" #include #include #include #include #include #include #include /** * @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 fieldWidgets; // fieldId -> widget (for form/series) QTableWidget *gridWidget = nullptr; // for grid tables QTableWidget *seriesWidget = nullptr; // for series tables }; QMap tableData; }; #endif // TABLEWIDGETFACTORY_H