From 2af12b298ca624c17f78cea0c70f400ec14c8049 Mon Sep 17 00:00:00 2001 From: taocong Date: Tue, 26 May 2026 16:13:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E9=A1=B5=E9=9D=A2=EF=BC=8C=E6=94=AF=E6=8C=81=E6=8C=89?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=92=8C=E5=8A=9F=E8=83=BD=E5=8F=B7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/images/chaxun.png | Bin 0 -> 5034 bytes resources/images/zhuanhuan.png | Bin 0 -> 5405 bytes src/mainwindow/mainwindow.cpp | 24 ++- src/mainwindow/mainwindow.h | 4 + .../functionsearch/functionsearchpage.cpp | 144 +----------------- src/pages/functionsearch/functionsearchpage.h | 25 +-- .../functionsearch/uf20functionsearchpage.cpp | 95 ++++++++++++ .../functionsearch/uf20functionsearchpage.h | 29 ++++ .../functionsearch/uft3functionsearchpage.cpp | 95 ++++++++++++ .../functionsearch/uft3functionsearchpage.h | 29 ++++ src/utils/datacache.cpp | 104 ++++++++++++- src/utils/datacache.h | 8 + src/utils/uf2configreader.cpp | 8 + src/utils/uf2configreader.h | 1 + src/utils/uft3configreader.cpp | 8 + src/utils/uft3configreader.h | 1 + 16 files changed, 413 insertions(+), 162 deletions(-) create mode 100644 resources/images/chaxun.png create mode 100644 resources/images/zhuanhuan.png create mode 100644 src/pages/functionsearch/uf20functionsearchpage.cpp create mode 100644 src/pages/functionsearch/uf20functionsearchpage.h create mode 100644 src/pages/functionsearch/uft3functionsearchpage.cpp create mode 100644 src/pages/functionsearch/uft3functionsearchpage.h diff --git a/resources/images/chaxun.png b/resources/images/chaxun.png new file mode 100644 index 0000000000000000000000000000000000000000..952dacc0aa2f97f4dc4870ac7dad3a33cd7aaac2 GIT binary patch literal 5034 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 -#include -#include -#include -#include -#include -#include -#include -#include +#include FunctionSearchPage::FunctionSearchPage(QWidget *parent) : QWidget(parent) @@ -21,133 +14,10 @@ FunctionSearchPage::~FunctionSearchPage() void FunctionSearchPage::initUI() { - QVBoxLayout *mainLayout = new QVBoxLayout(this); - mainLayout->setContentsMargins(30, 30, 30, 30); - mainLayout->setSpacing(15); - - m_tabWidget = new QTabWidget; - - // ========================================== - // Tab 1: UF20功能搜索 - // ========================================== - QWidget *uf20Tab = new QWidget; - QVBoxLayout *uf20Layout = new QVBoxLayout(uf20Tab); - uf20Layout->setSpacing(15); - - QHBoxLayout *uf20SearchLayout = new QHBoxLayout; - m_uf20SearchEdit = new QLineEdit; - m_uf20SearchEdit->setPlaceholderText("输入功能名称或关键词搜索..."); - m_uf20SearchBtn = new QPushButton("搜索"); - m_uf20SearchBtn->setStyleSheet("padding: 8px 25px;"); - connect(m_uf20SearchBtn, &QPushButton::clicked, this, &FunctionSearchPage::onSearchUF20); - connect(m_uf20SearchEdit, &QLineEdit::returnPressed, this, &FunctionSearchPage::onSearchUF20); - connect(m_uf20SearchEdit, &QLineEdit::textChanged, this, &FunctionSearchPage::onUF20SearchTextChanged); - uf20SearchLayout->addWidget(m_uf20SearchEdit); - uf20SearchLayout->addWidget(m_uf20SearchBtn); - uf20Layout->addLayout(uf20SearchLayout); - - m_uf20ResultTable = new QTableWidget; - m_uf20ResultTable->setColumnCount(4); - m_uf20ResultTable->setHorizontalHeaderLabels({"功能名称", "功能类型", "所属模块", "文件路径"}); - m_uf20ResultTable->horizontalHeader()->setStretchLastSection(true); - m_uf20ResultTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); - m_uf20ResultTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents); - m_uf20ResultTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); - m_uf20ResultTable->setSelectionBehavior(QAbstractItemView::SelectRows); - m_uf20ResultTable->setEditTriggers(QAbstractItemView::NoEditTriggers); - m_uf20ResultTable->setAlternatingRowColors(true); - uf20Layout->addWidget(m_uf20ResultTable); - - m_uf20StatusLabel = new QLabel("请输入关键词搜索UF20功能"); - uf20Layout->addWidget(m_uf20StatusLabel); - - m_tabWidget->addTab(uf20Tab, "UF20功能"); - - // ========================================== - // Tab 2: UFT3功能搜索 - // ========================================== - QWidget *uft3Tab = new QWidget; - QVBoxLayout *uft3Layout = new QVBoxLayout(uft3Tab); - uft3Layout->setSpacing(15); - - QHBoxLayout *uft3SearchLayout = new QHBoxLayout; - m_uft3SearchEdit = new QLineEdit; - m_uft3SearchEdit->setPlaceholderText("输入功能名称或关键词搜索..."); - m_uft3SearchBtn = new QPushButton("搜索"); - m_uft3SearchBtn->setStyleSheet("padding: 8px 25px;"); - connect(m_uft3SearchBtn, &QPushButton::clicked, this, &FunctionSearchPage::onSearchUFT3); - connect(m_uft3SearchEdit, &QLineEdit::returnPressed, this, &FunctionSearchPage::onSearchUFT3); - connect(m_uft3SearchEdit, &QLineEdit::textChanged, this, &FunctionSearchPage::onUFT3SearchTextChanged); - uft3SearchLayout->addWidget(m_uft3SearchEdit); - uft3SearchLayout->addWidget(m_uft3SearchBtn); - uft3Layout->addLayout(uft3SearchLayout); - - m_uft3ResultTable = new QTableWidget; - m_uft3ResultTable->setColumnCount(4); - m_uft3ResultTable->setHorizontalHeaderLabels({"功能名称", "功能类型", "所属模块", "文件路径"}); - m_uft3ResultTable->horizontalHeader()->setStretchLastSection(true); - m_uft3ResultTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); - m_uft3ResultTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents); - m_uft3ResultTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); - m_uft3ResultTable->setSelectionBehavior(QAbstractItemView::SelectRows); - m_uft3ResultTable->setEditTriggers(QAbstractItemView::NoEditTriggers); - m_uft3ResultTable->setAlternatingRowColors(true); - uft3Layout->addWidget(m_uft3ResultTable); - - m_uft3StatusLabel = new QLabel("请输入关键词搜索UFT3功能"); - uft3Layout->addWidget(m_uft3StatusLabel); - - m_tabWidget->addTab(uft3Tab, "UFT3功能"); - - mainLayout->addWidget(m_tabWidget); -} - -void FunctionSearchPage::onSearchUF20() -{ - QString keyword = m_uf20SearchEdit->text().trimmed(); - if (keyword.isEmpty()) { - m_uf20StatusLabel->setText("请输入搜索关键词"); - return; - } - - m_uf20ResultTable->setRowCount(0); - m_uf20StatusLabel->setText(QString("正在搜索 \"%1\"...").arg(keyword)); - - m_uf20ResultTable->insertRow(0); - m_uf20ResultTable->setItem(0, 0, new QTableWidgetItem(keyword)); - m_uf20ResultTable->setItem(0, 1, new QTableWidgetItem("-")); - m_uf20ResultTable->setItem(0, 2, new QTableWidgetItem("-")); - m_uf20ResultTable->setItem(0, 3, new QTableWidgetItem("-")); - - m_uf20StatusLabel->setText(QString("搜索完成,共找到 1 条结果")); -} - -void FunctionSearchPage::onSearchUFT3() -{ - QString keyword = m_uft3SearchEdit->text().trimmed(); - if (keyword.isEmpty()) { - m_uft3StatusLabel->setText("请输入搜索关键词"); - return; - } - - m_uft3ResultTable->setRowCount(0); - m_uft3StatusLabel->setText(QString("正在搜索 \"%1\"...").arg(keyword)); - - m_uft3ResultTable->insertRow(0); - m_uft3ResultTable->setItem(0, 0, new QTableWidgetItem(keyword)); - m_uft3ResultTable->setItem(0, 1, new QTableWidgetItem("-")); - m_uft3ResultTable->setItem(0, 2, new QTableWidgetItem("-")); - m_uft3ResultTable->setItem(0, 3, new QTableWidgetItem("-")); - - m_uft3StatusLabel->setText(QString("搜索完成,共找到 1 条结果")); -} - -void FunctionSearchPage::onUF20SearchTextChanged(const QString &text) -{ - Q_UNUSED(text); -} - -void FunctionSearchPage::onUFT3SearchTextChanged(const QString &text) -{ - Q_UNUSED(text); + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setContentsMargins(30, 30, 30, 30); + + QLabel *label = new QLabel("功能查询"); + label->setStyleSheet("font-size: 18px; font-weight: bold;"); + layout->addWidget(label); } diff --git a/src/pages/functionsearch/functionsearchpage.h b/src/pages/functionsearch/functionsearchpage.h index 604f5d9..de85f47 100644 --- a/src/pages/functionsearch/functionsearchpage.h +++ b/src/pages/functionsearch/functionsearchpage.h @@ -3,10 +3,8 @@ #include #include -#include #include #include -#include class FunctionSearchPage : public QWidget { @@ -16,26 +14,11 @@ public: explicit FunctionSearchPage(QWidget *parent = nullptr); ~FunctionSearchPage(); -private slots: - void onSearchUF20(); - void onSearchUFT3(); - void onUF20SearchTextChanged(const QString &text); - void onUFT3SearchTextChanged(const QString &text); - private: void initUI(); - - QTabWidget *m_tabWidget; - - QLineEdit *m_uf20SearchEdit; - QPushButton *m_uf20SearchBtn; - QTableWidget *m_uf20ResultTable; - QLabel *m_uf20StatusLabel; - - QLineEdit *m_uft3SearchEdit; - QPushButton *m_uft3SearchBtn; - QTableWidget *m_uft3ResultTable; - QLabel *m_uft3StatusLabel; + + QLineEdit *m_searchEdit; + QTableWidget *m_resultTable; }; -#endif // FUNCTIONSEARCHPAGE_H +#endif diff --git a/src/pages/functionsearch/uf20functionsearchpage.cpp b/src/pages/functionsearch/uf20functionsearchpage.cpp new file mode 100644 index 0000000..40e41e8 --- /dev/null +++ b/src/pages/functionsearch/uf20functionsearchpage.cpp @@ -0,0 +1,95 @@ +#include "uf20functionsearchpage.h" +#include "src/utils/datacache.h" +#include +#include +#include +#include +#include +#include +#include + +UF20FunctionSearchPage::UF20FunctionSearchPage(QWidget *parent) + : QWidget(parent) +{ + initUI(); +} + +UF20FunctionSearchPage::~UF20FunctionSearchPage() +{ +} + +void UF20FunctionSearchPage::initUI() +{ + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setContentsMargins(30, 30, 30, 30); + layout->setSpacing(20); + + QHBoxLayout *searchLayout = new QHBoxLayout; + searchLayout->setSpacing(10); + + m_searchComboBox = new QComboBox; + m_searchComboBox->addItem("功能名称", "cname"); + m_searchComboBox->addItem("功能编号", "function_no"); + searchLayout->addWidget(m_searchComboBox); + + m_searchEdit = new QLineEdit; + m_searchEdit->setPlaceholderText("输入查询内容"); + m_searchEdit->setMinimumWidth(300); + searchLayout->addWidget(m_searchEdit); + + QPushButton *searchBtn = new QPushButton("搜索"); + searchBtn->setStyleSheet("background-color: #3498db; color: white; padding: 6px 20px; border: none; border-radius: 4px;"); + connect(searchBtn, &QPushButton::clicked, this, &UF20FunctionSearchPage::onSearch); + searchLayout->addWidget(searchBtn); + + searchLayout->addStretch(); + layout->addLayout(searchLayout); + + m_resultTable = new QTableWidget; + m_resultTable->setColumnCount(3); + m_resultTable->setHorizontalHeaderLabels({"英文名", "功能编号", "功能名称"}); + m_resultTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + m_resultTable->setMinimumHeight(400); + m_resultTable->setSelectionBehavior(QAbstractItemView::SelectRows); + m_resultTable->setEditTriggers(QAbstractItemView::NoEditTriggers); + layout->addWidget(m_resultTable); +} + +void UF20FunctionSearchPage::onSearch() +{ + QString keyword = m_searchEdit->text().trimmed(); + + m_resultTable->setRowCount(0); + + if (keyword.isEmpty()) { + QMessageBox::information(this, "提示", "请输入查询内容"); + return; + } + + QString field = m_searchComboBox->currentData().toString(); + QList results = DataCache::instance()->searchUF20Functions(keyword, field); + + if (results.isEmpty()) { + QMessageBox::information(this, "提示", "未找到匹配的功能"); + return; + } + + int row = 0; + for (const FunctionInfo& info : results) { + m_resultTable->insertRow(row); + + QTableWidgetItem *cnameItem = new QTableWidgetItem(info.cname); + cnameItem->setFlags(cnameItem->flags() & ~Qt::ItemIsEditable); + m_resultTable->setItem(row, 0, cnameItem); + + QTableWidgetItem *eNameItem = new QTableWidgetItem(info.eName); + eNameItem->setFlags(eNameItem->flags() & ~Qt::ItemIsEditable); + m_resultTable->setItem(row, 1, eNameItem); + + QTableWidgetItem *funcNoItem = new QTableWidgetItem(info.functionNo); + funcNoItem->setFlags(funcNoItem->flags() & ~Qt::ItemIsEditable); + m_resultTable->setItem(row, 2, funcNoItem); + + row++; + } +} diff --git a/src/pages/functionsearch/uf20functionsearchpage.h b/src/pages/functionsearch/uf20functionsearchpage.h new file mode 100644 index 0000000..bfeb318 --- /dev/null +++ b/src/pages/functionsearch/uf20functionsearchpage.h @@ -0,0 +1,29 @@ +#ifndef UF20FUNCTIONSEARCHPAGE_H +#define UF20FUNCTIONSEARCHPAGE_H + +#include +#include +#include +#include +#include + +class UF20FunctionSearchPage : public QWidget +{ + Q_OBJECT + +public: + explicit UF20FunctionSearchPage(QWidget *parent = nullptr); + ~UF20FunctionSearchPage(); + +private slots: + void onSearch(); + +private: + void initUI(); + + QComboBox *m_searchComboBox; + QLineEdit *m_searchEdit; + QTableWidget *m_resultTable; +}; + +#endif diff --git a/src/pages/functionsearch/uft3functionsearchpage.cpp b/src/pages/functionsearch/uft3functionsearchpage.cpp new file mode 100644 index 0000000..86945d4 --- /dev/null +++ b/src/pages/functionsearch/uft3functionsearchpage.cpp @@ -0,0 +1,95 @@ +#include "uft3functionsearchpage.h" +#include "src/utils/datacache.h" +#include +#include +#include +#include +#include +#include +#include + +UFT3FunctionSearchPage::UFT3FunctionSearchPage(QWidget *parent) + : QWidget(parent) +{ + initUI(); +} + +UFT3FunctionSearchPage::~UFT3FunctionSearchPage() +{ +} + +void UFT3FunctionSearchPage::initUI() +{ + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setContentsMargins(30, 30, 30, 30); + layout->setSpacing(20); + + QHBoxLayout *searchLayout = new QHBoxLayout; + searchLayout->setSpacing(10); + + m_searchComboBox = new QComboBox; + m_searchComboBox->addItem("功能名称", "cname"); + m_searchComboBox->addItem("功能编号", "function_no"); + searchLayout->addWidget(m_searchComboBox); + + m_searchEdit = new QLineEdit; + m_searchEdit->setPlaceholderText("输入查询内容"); + m_searchEdit->setMinimumWidth(300); + searchLayout->addWidget(m_searchEdit); + + QPushButton *searchBtn = new QPushButton("搜索"); + searchBtn->setStyleSheet("background-color: #3498db; color: white; padding: 6px 20px; border: none; border-radius: 4px;"); + connect(searchBtn, &QPushButton::clicked, this, &UFT3FunctionSearchPage::onSearch); + searchLayout->addWidget(searchBtn); + + searchLayout->addStretch(); + layout->addLayout(searchLayout); + + m_resultTable = new QTableWidget; + m_resultTable->setColumnCount(3); + m_resultTable->setHorizontalHeaderLabels({"英文名", "功能编号", "功能名称"}); + m_resultTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + m_resultTable->setMinimumHeight(400); + m_resultTable->setSelectionBehavior(QAbstractItemView::SelectRows); + m_resultTable->setEditTriggers(QAbstractItemView::NoEditTriggers); + layout->addWidget(m_resultTable); +} + +void UFT3FunctionSearchPage::onSearch() +{ + QString keyword = m_searchEdit->text().trimmed(); + + m_resultTable->setRowCount(0); + + if (keyword.isEmpty()) { + QMessageBox::information(this, "提示", "请输入查询内容"); + return; + } + + QString field = m_searchComboBox->currentData().toString(); + QList results = DataCache::instance()->searchUFT3Functions(keyword, field); + + if (results.isEmpty()) { + QMessageBox::information(this, "提示", "未找到匹配的功能"); + return; + } + + int row = 0; + for (const FunctionInfo& info : results) { + m_resultTable->insertRow(row); + + QTableWidgetItem *cnameItem = new QTableWidgetItem(info.cname); + cnameItem->setFlags(cnameItem->flags() & ~Qt::ItemIsEditable); + m_resultTable->setItem(row, 0, cnameItem); + + QTableWidgetItem *eNameItem = new QTableWidgetItem(info.eName); + eNameItem->setFlags(eNameItem->flags() & ~Qt::ItemIsEditable); + m_resultTable->setItem(row, 1, eNameItem); + + QTableWidgetItem *funcNoItem = new QTableWidgetItem(info.functionNo); + funcNoItem->setFlags(funcNoItem->flags() & ~Qt::ItemIsEditable); + m_resultTable->setItem(row, 2, funcNoItem); + + row++; + } +} diff --git a/src/pages/functionsearch/uft3functionsearchpage.h b/src/pages/functionsearch/uft3functionsearchpage.h new file mode 100644 index 0000000..79075c8 --- /dev/null +++ b/src/pages/functionsearch/uft3functionsearchpage.h @@ -0,0 +1,29 @@ +#ifndef UFT3FUNCTIONSEARCHPAGE_H +#define UFT3FUNCTIONSEARCHPAGE_H + +#include +#include +#include +#include +#include + +class UFT3FunctionSearchPage : public QWidget +{ + Q_OBJECT + +public: + explicit UFT3FunctionSearchPage(QWidget *parent = nullptr); + ~UFT3FunctionSearchPage(); + +private slots: + void onSearch(); + +private: + void initUI(); + + QComboBox *m_searchComboBox; + QLineEdit *m_searchEdit; + QTableWidget *m_resultTable; +}; + +#endif diff --git a/src/utils/datacache.cpp b/src/utils/datacache.cpp index af09222..f2b8739 100644 --- a/src/utils/datacache.cpp +++ b/src/utils/datacache.cpp @@ -149,7 +149,7 @@ bool DataCache::saveUF20Config(const QString& fileName, const QJsonObject& data) if (!cname.isEmpty()) { cnames.append(cname); eNames.append(obj.value("eName").toString()); - functionNos.append(obj.value("function_no").toString()); + functionNos.append(obj.value("functionNo").toString()); } } } @@ -205,7 +205,7 @@ bool DataCache::saveUFT3Config(const QString& fileName, const QJsonObject& data) if (!cname.isEmpty()) { cnames.append(cname); eNames.append(obj.value("eName").toString()); - functionNos.append(obj.value("function_no").toString()); + functionNos.append(obj.value("functionNo").toString()); } } } @@ -313,6 +313,56 @@ QSet DataCache::getAllUF20Cnames() return result; } +QList DataCache::searchUF20Functions(const QString& keyword, const QString& field) +{ + QList result; + + if (!m_db.isOpen()) { + return result; + } + + QSqlQuery query(m_db); + QString sql; + + if (field == "cname") { + sql = R"( + SELECT cname, e_name, function_no + FROM uf20_cname_table + WHERE cname LIKE :keyword + ORDER BY cname + )"; + } else if (field == "function_no") { + sql = R"( + SELECT cname, e_name, function_no + FROM uf20_cname_table + WHERE function_no LIKE :keyword + ORDER BY cname + )"; + } else { + sql = R"( + SELECT cname, e_name, function_no + FROM uf20_cname_table + WHERE cname LIKE :keyword OR e_name LIKE :keyword OR function_no LIKE :keyword + ORDER BY cname + )"; + } + + query.prepare(sql); + query.bindValue(":keyword", "%" + keyword + "%"); + + if (query.exec()) { + while (query.next()) { + FunctionInfo info; + info.cname = query.value(0).toString(); + info.eName = query.value(1).toString(); + info.functionNo = query.value(2).toString(); + result.append(info); + } + } + + return result; +} + bool DataCache::checkUFT3CnameExists(const QString& cname) { if (!m_db.isOpen()) { @@ -352,6 +402,56 @@ QSet DataCache::getAllUFT3Cnames() return result; } +QList DataCache::searchUFT3Functions(const QString& keyword, const QString& field) +{ + QList result; + + if (!m_db.isOpen()) { + return result; + } + + QSqlQuery query(m_db); + QString sql; + + if (field == "cname") { + sql = R"( + SELECT cname, e_name, function_no + FROM uft3_cname_table + WHERE cname LIKE :keyword + ORDER BY cname + )"; + } else if (field == "function_no") { + sql = R"( + SELECT cname, e_name, function_no + FROM uft3_cname_table + WHERE function_no LIKE :keyword + ORDER BY cname + )"; + } else { + sql = R"( + SELECT cname, e_name, function_no + FROM uft3_cname_table + WHERE cname LIKE :keyword OR e_name LIKE :keyword OR function_no LIKE :keyword + ORDER BY cname + )"; + } + + query.prepare(sql); + query.bindValue(":keyword", "%" + keyword + "%"); + + if (query.exec()) { + while (query.next()) { + FunctionInfo info; + info.cname = query.value(0).toString(); + info.eName = query.value(1).toString(); + info.functionNo = query.value(2).toString(); + result.append(info); + } + } + + return result; +} + void DataCache::clearCache() { if (!m_db.isOpen()) { diff --git a/src/utils/datacache.h b/src/utils/datacache.h index 1100b3f..2c2a427 100644 --- a/src/utils/datacache.h +++ b/src/utils/datacache.h @@ -6,6 +6,12 @@ #include #include +struct FunctionInfo { + QString cname; + QString eName; + QString functionNo; +}; + class DataCache : public QObject { Q_OBJECT @@ -25,9 +31,11 @@ public: bool checkUF20CnameExists(const QString& cname); QSet getAllUF20Cnames(); + QList searchUF20Functions(const QString& keyword, const QString& field = ""); bool checkUFT3CnameExists(const QString& cname); QSet getAllUFT3Cnames(); + QList searchUFT3Functions(const QString& keyword, const QString& field = ""); void clearCache(); diff --git a/src/utils/uf2configreader.cpp b/src/utils/uf2configreader.cpp index 7d05567..973f710 100644 --- a/src/utils/uf2configreader.cpp +++ b/src/utils/uf2configreader.cpp @@ -152,3 +152,11 @@ void UF2ConfigReader::clearCnameCache() m_cnameCacheLoaded = false; LogManager::instance()->logInfo("Cname缓存已清空"); } + +QSet UF2ConfigReader::getAllCnamesStatic() +{ + if (!m_cnameCacheLoaded) { + loadCnameCache(); + } + return m_cnameCache; +} diff --git a/src/utils/uf2configreader.h b/src/utils/uf2configreader.h index 1156e53..1a11109 100644 --- a/src/utils/uf2configreader.h +++ b/src/utils/uf2configreader.h @@ -21,6 +21,7 @@ public: bool checkFunctionExists(const QString& funcName); static bool checkFuncExistsStatic(const QString& funcName); static void clearCnameCache(); + static QSet getAllCnamesStatic(); private: static bool loadCnameCache(); diff --git a/src/utils/uft3configreader.cpp b/src/utils/uft3configreader.cpp index 0ead172..90ffaa0 100644 --- a/src/utils/uft3configreader.cpp +++ b/src/utils/uft3configreader.cpp @@ -152,3 +152,11 @@ void UFT3ConfigReader::clearCnameCache() m_cnameCacheLoaded = false; LogManager::instance()->logInfo("UFT3 Cname缓存已清空"); } + +QSet UFT3ConfigReader::getAllCnamesStatic() +{ + if (!m_cnameCacheLoaded) { + loadCnameCache(); + } + return m_cnameCache; +} diff --git a/src/utils/uft3configreader.h b/src/utils/uft3configreader.h index 73f111a..2c8d8a5 100644 --- a/src/utils/uft3configreader.h +++ b/src/utils/uft3configreader.h @@ -21,6 +21,7 @@ public: bool checkFunctionExists(const QString& funcName); static bool checkFuncExistsStatic(const QString& funcName); static void clearCnameCache(); + static QSet getAllCnamesStatic(); private: static bool loadCnameCache();