#ifndef TABLESEARCHPAGE_H #define TABLESEARCHPAGE_H #include #include #include "components/elasearchedit.h" #include "ElaTableView.h" class QLabel; // UF20 & 内存表映射查询页(原"表查询"): 检索 UF20(2.0) 表与内存表(UFT3)之间的映射关系。 // 结果四列: UF20表名 / UF20表中文名(uf20_cache.db 按 key 取) / // 内存表名(table_mapping.json 映射的 value) / 内存表中文名(uft3_cache.db 按 value 取)。 // 输入 UF20 表名或内存表名均可检索, 支持精确/模糊(ElaSearchEdit 内置开关)两种模式; // 无映射命中的表仅展示数据库侧字段, 映射相关列置空。 // 双击有完整映射的记录行可添加到「数据映射 → 表替换」页(经 MainWindow 接线, 追加后自动落盘)。 // 不继承 FunctionSearchPageBase: 结果结构为 4 列表信息, 与 FunctionInfo(3 列函数信息) // 结构不同, 数据源与交互(无批量加入)亦不同, 强行复用基类不值 class TableSearchPage : public QWidget { Q_OBJECT public: explicit TableSearchPage(QWidget *parent = nullptr); // 双击添加的回调结果(经 MainWindow 接线后回传): error 为空即添加成功, 非空为原因 void onMappingAddResult(const QString& error); signals: // 双击有完整映射的记录行 → 请求把 (UF20表名, 内存表名) 添加到表替换页 void requestAddMapping(const QString& uf20Name, const QString& memName); private slots: void onSearch(); void onExactMatchToggled(bool checked); // 双击记录行: 有完整映射发出 requestAddMapping, 单侧行仅 tip 提示 void onDoubleClicked(const QModelIndex& index); // tip 标签主题感知(Ela 原生控件颜色不随主题切换, 需手动跟随) void updateTipStyle(); private: void initUI(); // 读取表映射文件(Constants::tableMappingJson(), 即 bin/uf2touft3/config/table_mapping.json, // 顶层键 tableCompareUf2_Uf3: key=UF20表名, value=内存表名; value 可为字符串(一对一) // 或字符串数组(一对多, 拆为多条映射对))。 // readOk 出参: 文件读取/解析成功为 true(映射本身可为空), 失败为 false; // errorOut 出参: 失败时带回可展示的错误原因(含行号, 常见手误如末项尾随逗号) QList> loadTableMapping(bool* readOk, QString* errorOut = nullptr) const; ElaSearchEdit *m_searchEdit; ElaTableView *m_resultTable; QStandardItemModel *m_tableModel; QLabel *m_tipLabel; bool m_exactMatch; }; #endif