一个使用 C++17 + Qt 6 + CMake 编写的 Minecraft 模组自动检索桌面程序。它扫描 mods 文件夹中的 .jar 文件名,清洗出检索名称,异步查询 Modrinth 和 CurseForge,把两个平台的结果展示在同一张表中,并支持导出 CSV / Markdown / Excel。可选启用 MC百科进阶检索。
- 扫描
.jar文件,默认仅当前目录,可设置递归子目录。 - 文件名多级清洗:
- 去
.jar - 删除
[]、【】、[]及其中的内容(例如中文名/版本前缀) - token 级去除
beta/alpha/snapshot - 去除版本段:
1.20.1、v0.5.8、mc1.20.1、MC_1.20.1、build.10、V29 - 去除尾部打包标记:
hotfix、universal、all、slim、RE、release、NOBIOMES - 加载器词清洗(
fabric、forge、neoforge、quilt、liteloader、rift、modloader) - 去除
+/-/_并合并多余分隔符
- 去
- 主界面显示:原始文件名、基础清洗名、检索用名称、两平台名称/ID/作者/许可证/直链、MC百科链接、状态备注、操作按钮。
- 菜单栏“关于”提供程序信息与 CC0 1.0 许可证说明;程序版本
1.1.0。 - 异步网络:
- 每个平台独立的并发数、最小请求间隔、超时、总尝试次数。
- 404 不重试;408/425/429/5xx/超时/网络错误重试。
- 429 优先遵守
Retry-After,否则指数退避。 - 所有请求通过
QNetworkAccessManager,不为请求创建线程;UI 不阻塞。
- 检索前并行检查 Modrinth / CurseForge 连通性;CurseForge 同时验证 API Key。
- 进度条数字统一使用阿拉伯数字
0-9,并显式指定无衬线 UI 字体,避免系统字体替换。 - 取消时保留已完成结果,中止已发出的请求。
- 操作列动态菜单:复制 TSV、打开直链、移除结果、详细原始信息、重新检索、手动检索、错误详情、删除整行。
- 单独检索窗口:原样使用输入名称,多平台、多候选、多选,添加到表格或更新原行。
- 总结视图:按许可证、按检索状态分组,可重新检索 / 复制名称 / 手动检索,双击跳转主表。
- 导出 CSV、Markdown、Excel(
.xlsx)。Excel 由内置最小 OOXML 生成器实现,不依赖 QXlsx。 - 可选 MC百科检索:
- 优先使用非官方 JSON API:
mcmod-api。 - API 不可用或未精确匹配时回退到 MC百科搜索页链接。
- 不计入主进度,失败不影响主检索和导出。
- 优先使用非官方 JSON API:
- QSettings 持久化设置;非法值回退默认值。
- API Key 与 User-Agent 不写入日志。
- C++17 编译器
- Qt 6.5 或更高版本,至少包含
Core、Gui、Widgets、Network;测试还需要Test - CMake 3.21+
- Windows 推荐 Qt 官方 MinGW 套件或 MSVC 2022;Linux/macOS 使用发行版 Qt 6
本项目已在 Qt 6.11.2 + MinGW 13.1 + CMake 3.30.5 上实际构建通过。
无第三方导出库依赖(不需要 QXlsx、libxlsxwriter 等)。
build.ps1 会自动寻找 Qt 6 Kit、Qt 自带的 MinGW/CMake、配置并构建,还可选跑测试和部署 Qt 运行时。
# 清理后构建 Release,并运行核心测试
.\build.ps1 -Clean -Test
# 指定 Qt Kit
.\build.ps1 -QtDir "D:\Qt\6.11.2\mingw_64" -Clean -Test
# 构建 Debug
.\build.ps1 -Configuration Debug
# 构建并生成可直接分发的 dist 目录
.\build.ps1 -Deploy
# 部署后直接启动
.\build.ps1 -Deploy -Run如果系统执行策略禁止运行脚本:
powershell -ExecutionPolicy Bypass -File .\build.ps1 -Clean -Test常用参数:
| 参数 | 说明 |
|---|---|
-QtDir <path> |
指定 Qt Kit;省略时检查 QTDIR、qmake6、C:\Qt、D:\Qt |
-BuildDir <path> |
构建目录,默认 build,必须在工程目录内 |
-Configuration Debug/Release/... |
构建配置,默认 Release |
-Clean |
删除构建目录后重新配置 |
-Test |
构建后运行 CTest |
-Deploy |
复制到 dist 并执行 windeployqt |
-Run |
构建/部署完成后启动程序 |
-Jobs <n> |
并行构建任务数,默认逻辑处理器数 |
-Generator <name> |
覆盖 CMake 生成器,例如 "Visual Studio 17 2022" |
脚本会优先选择最新的 Qt 6 64 位 Kit;同版本下优先 MinGW。MSVC Kit 默认使用
Visual Studio 17 2022。
假设 Qt 安装于 D:/Qt/6.11.2/mingw_64,MinGW 位于 D:/Qt/Tools/mingw1310_64:
$env:Path = "D:\Qt\6.11.2\mingw_64\bin;D:\Qt\Tools\mingw1310_64\bin;D:\Qt\Tools\CMake_64\bin;" + $env:Path
cmake -S . -B build -G "MinGW Makefiles" `
-DCMAKE_BUILD_TYPE=Release `
-DCMAKE_PREFIX_PATH="D:/Qt/6.11.2/mingw_64" `
-DCMAKE_CXX_COMPILER="D:/Qt/Tools/mingw1310_64/bin/g++.exe"
cmake --build build -j生成:
build/MinecraftModScanner.exe
也可以直接用 Qt Creator 打开 CMakeLists.txt,选择对应 Kit 构建。
cmake -S . -B build-msvc -G "Visual Studio 17 2022" -A x64 `
-DCMAKE_PREFIX_PATH="C:/Qt/6.8.0/msvc2022_64"
cmake --build build-msvc --config Releasecmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -jmacOS 会生成 .app 包;仍建议使用对应 Qt Kit。
Windows 构建默认在链接完成后自动运行 windeployqt,把 Qt6Core.dll、Qt6Gui.dll、
Qt6Network.dll、Qt6Widgets.dll、platforms/qwindows.dll 等复制到 EXE 所在目录。
因此 build\MinecraftModScanner.exe 可以脱离 Qt 的 PATH 直接启动。
自动部署由 CMake 选项控制,默认开启:
# 关闭自动部署(需要自己配置 Qt DLL 或 PATH)
cmake -S . -B build -DMMS_DEPLOY_QT_RUNTIME=OFF发布为独立目录:
.\build.ps1 -Deploy该命令会额外生成 dist/,包含 EXE 和完整 Qt 运行时,可直接打包分发。
如果旧构建仍提示缺少 Qt6Network.dll,请重新执行:
.\build.ps1 -Clean -Test或手动对旧 EXE 执行:
D:\Qt\6.11.2\mingw_64\bin\windeployqt.exe --release --no-translations build\MinecraftModScanner.exe或使用 CMake 安装与 Qt 部署脚本:
cmake --install build --prefix distQt 的部署脚本会调用 windeployqt,把所需 DLL 和 platforms/qwindows.dll 等插件放入输出目录。
- 启动程序。
- 点击 选择 mods 文件夹,选择包含
.jar的目录;扫描完成后会弹出提示。 - (可选)在密码框填入 CurseForge API Key,点击 验证 Key / 检查连接。
- 点击 开始检索。
- 未填写 CurseForge Key 时会弹窗询问;选择“仅检索 Modrinth(不填写)”会禁用 CurseForge。
- 程序会先并行检查两个平台的连通性,再开始检索。
- 观察进度条和状态文本;可随时点击 取消,已有结果会保留。
- 完成后会显示汇总。可用 工具 → 总结视图… 查看分组统计。
- 用 导出 按钮或菜单导出 CSV / Markdown / Excel。
- 每行最后一列 操作 打开按平台分组的动态菜单;主检索进行中该列被禁用。
- 复制:复制该平台结果摘要 TSV:名称、ID、作者、许可证、直链。
- 打开直链 / 复制直链:调用系统默认浏览器打开,或单独复制 URL。
- 移除结果:仅清空该平台结果与状态,行保留,状态变为未检索。
- 详细检索原始信息 / 错误详情:只读详情对话框,显示请求 URL、HTTP 状态、耗时、总尝试次数、重试次数、时间、原始响应 JSON,可复制。
- 重新检索:同平台、同检索名称重新请求,成功后更新原行。
- 手动检索…:打开单独检索窗口,预填检索名称;选中的结果更新原行,不新增行。
- 删除整行:需确认,之后从表格删除。
表格中的 Modrinth / CurseForge / MC百科链接单元格支持单击直接打开浏览器;单独检索结果表支持双击 URL 打开。
Windows 下按以下顺序尝试打开链接:
- Win32
ShellExecuteW(使用完整百分号编码 URL); QDesktopServices::openUrl;explorer.exe <url>;rundll32 url.dll,FileProtocolHandler <url>。
如果全部失败,程序会:
- 自动把完整链接复制到剪贴板;
- 弹出可读错误对话框,并由“详细信息”显示系统错误码;
- 提示在 Windows“设置 → 应用 → 默认应用”中重新设置默认浏览器。
常见原因:默认浏览器未设置、浏览器关联损坏、链接被安全软件拦截,或程序以与浏览器不兼容的权限运行。可先复制链接到浏览器手动打开,再修复系统默认应用关联。日志文件夹也使用同一套打开逻辑。
工具 → 单独检索…:
- 输入名称原样使用,不做任何清洗。
- 默认勾选两个平台;没有 CurseForge Key 时 CurseForge 不可选。
- 结果表列出最多 10 个候选;默认不选中;支持多选。
- 选择结果后添加到主表:原始文件名显示“(手动)”,基础清洗名为空,备注“手动添加”。
- 若已存在相同平台 + 相同 ID,会先确认。
- 主检索进行中时禁止打开。
- 按许可证:MIT、Apache-2.0、GPL-3.0、LGPL、All Rights Reserved、多许可证、未知许可证、未检索/未找到。
- 按检索状态:成功、404未找到、请求失败、跳过、清洗异常、待检索、用户取消。
- 许可证会归一化;多许可证行可同时出现在具体许可证组和“多许可证”组。
- 非成功条目右侧提供 重新检索 / 复制名称 / 手动检索。
- 双击条目跳转并选中主表格对应行。
- 顶部有统计摘要和刷新按钮;模型变化时会自动刷新。
设置 → 首选项…,设置变更只影响下一次检索,不打断当前任务。
- User-Agent:默认
MinecraftModScanner/1.1.0 (Qt; contact:yang458coder@163.com)- 旧版默认占位 UA 会自动迁移到该值。
- 恢复默认 UA:只恢复输入框文本,不改变“使用浏览器 UA”勾选状态。
- 自定义 UA 为空时自动回退默认 UA。
[出现问题时请勾选此项] 使用浏览器 UA:- 默认不勾选。
- 勾选后忽略自定义 UA,使用集中定义的浏览器 UA:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 - 自定义 UA 输入框会禁用并显示说明;取消勾选后恢复。
- 代理:使用系统代理,或手动 HTTP 代理(地址、端口)。
| 设置 | Modrinth 默认 | CurseForge 默认 | 范围 |
|---|---|---|---|
| 最大尝试次数 | 3 | 3 | 1–5 |
| 单次请求超时 | 15 秒 | 15 秒 | 3–60 |
| 并发请求数 | 2 | 1 | 1–8 |
| 请求最小间隔 | 300 ms | 500 ms | 0–5000 ms |
“最大尝试次数”是总次数,包含第一次请求,不是额外重试次数。
- 递归扫描子目录:默认否。
- 启用 MC百科进阶检索:默认否。
- 默认导出格式:CSV / Markdown / Excel,默认 CSV。
- 记住 CurseForge API Key:默认否。
- 勾选时会弹窗明确提示明文存储风险。
- 未勾选时不会持久化 Key;已存在的旧 Key 会在保存设置时被删除。
- 恢复默认:恢复所有默认值(保留当前输入框中的运行时 Key,但“记住 Key”会回到默认的关闭状态)。
所有数值都会校验;非法值回退到 AppConfig 中的唯一默认值定义。
- 打开 CurseForge 开发者控制台。
- 登录并创建 API Key。
- 将 Key 填入主界面密码框。
- 点击 验证 Key / 检查连接。
没有 Key 时程序仍可完整使用 Modrinth、单独检索(Modrinth)、总结和导出。CurseForge 请求使用请求头 x-api-key,Key 不会放进 URL,也不会写入日志。
如果 CurseForge 返回 401/403,通常是 Key 无效、过期、权限不足或被服务端限制。请到控制台重新创建,或在设置中临时勾选“使用浏览器 UA”后重试连通性检查。
实现位于 src/ScanCleaner.cpp。
- 去除文件名末尾
.jar(大小写不敏感)。 - 删除方括号及其中内容:
[中文名]、【安全工艺】、[Forge 1.20.1]。 只删除括号段,不删除括号外的模组名称。 - 以独立 token 去除
beta、alpha、snapshot(大小写不敏感),保留分隔符。 - 删除版本段:
- 点号版本:
0.5.8、1.20.1、v1.2.3 - 带前缀版本:
mc1.20.1、MC_1.20.1、v2 - 构建号:
build.10、build-131、build131 - 短版本号:
V29
- 点号版本:
- 删除尾部打包/变体标记(大小写不敏感,仅当它位于末尾时):
hotfix、universal、all、slimrelease、RENOBIOMES
- 加载器清洗,此时仍保留
+、-、_:- 加载器词表集中定义在
AppConfig::loaderWords()。 - 仅按独立 token 匹配,不做子串替换。
- 当加载器词前一个字符是
-、+、_或空白时删除。 - 位于开头或前面不是分隔符的加载器词保留。
- 基础清洗名保留加载器;检索用名称才执行这一步。
- 删除后若为空,回退删除前结果并记录备注。
- 加载器词表集中定义在
- 把
+、-、_转为空格。 - 合并多余分隔符并 trim。
- 最终为空时回退原始文件名并标记清洗异常。
验收示例:
| 原始 | 基础清洗名 | 检索用名称 |
|---|---|---|
sodium-fabric-0.5.8.jar |
sodium-fabric |
sodium |
jei-forge-1.20.1.jar |
jei-forge |
jei |
sodium+fabric.jar |
sodium+fabric |
sodium |
fabric-api.jar |
fabric-api |
fabric api |
neoforge.jar |
neoforge |
neoforge |
ForgeConfigAPIPort.jar |
ForgeConfigAPIPort |
ForgeConfigAPIPort |
[TaC: 绿葡萄附属包] lradd-1.20.1-0.3.0.jar |
lradd |
lradd |
[Xaero的世界地图] xaeroworldmap-forge-1.20.1-1.46.0.jar |
xaeroworldmap-forge |
xaeroworldmap |
【安全工艺】[1.20.1] SecurityCraft-v1.10.2.1.jar |
SecurityCraft |
SecurityCraft |
tacz-1.20.1-1.1.8-hotfix.jar |
tacz |
tacz |
rhino-forge-2001.2.3-build.10.jar |
rhino-forge |
rhino |
ModernUI-Forge-1.20.1-3.12.0.1-universal.jar |
ModernUI-Forge |
ModernUI |
I18nUpdateMod-3.7.0-all.jar |
I18nUpdateMod |
I18nUpdateMod |
rubidium-extra-0.5.4.4+mc1.20.1-build.131.jar |
rubidium-extra |
rubidium extra |
CreativeCore_FORGE_v2.12.40_mc1.20.1.jar |
CreativeCore_FORGE |
CreativeCore |
endofdays-1.9.0-RE-slim.jar |
endofdays |
endofdays |
fancymenu_forge_3.9.14_MC_1.20.1.jar |
fancymenu_forge |
fancymenu |
MTS Official Pack-1.20.1-V29.jar |
MTS Official Pack |
MTS Official Pack |
NaturalDecorMod_NOBIOMES_1.20.1_V1.9.5.jar |
NaturalDecorMod |
NaturalDecorMod |
- 开始检索前检查启用的平台连通性。
- 每个任务独立按平台配置调度:
- 同时在途请求数不超过“并发请求数”。
- 两次请求启动至少间隔“最小请求间隔”。
- 单次请求由独立
QTimer超时;超时后abort()。
- 重试规则:
- HTTP 404:立即判定未找到,不重试。
- HTTP 429:重试;有
Retry-After时优先按它等待。 - HTTP 408 / 425 / 5xx、超时、网络错误:重试。
- 其他 4xx:直接失败,不重试。
- 200 但 JSON 解析失败:按可重试错误处理。
- 退避:约
800ms × 2^(attempt-1) + 0–250ms 抖动,上限 10 秒;429 的Retry-After最长等待 10 分钟。 - 状态文本显示“当前文件 · 当前平台 · 检索中 / 重试 n/m / 404 未找到 / 成功 / 失败”。
- 总进度 = 参与检索的扫描行数 × 启用平台数;MC百科单独提示,不占主进度。
- CSV:UTF-8 BOM + CRLF,字段全部加引号并转义,Excel 可直接打开。
- Markdown:标准 Markdown 表格,转义
|、换行等。 - Excel:内置最小 OOXML
.xlsx写入器(ZIP Store + inline strings),支持表头样式、冻结首行、自动筛选、列宽。 - 导出包含表格当前所有列(最后一列“操作”为空)和全部行,包括手动添加行。
- 导出前选择保存路径;默认文件名带时间戳。
- 默认导出目录为应用数据目录下的
exports,与settings.ini、日志处于同一已确认可写的位置:C:\Users\<用户>\AppData\LocalLow\MinecraftModScanner\MinecraftModScanner\exports。 如果该目录不可写,依次尝试用户主目录下的MinecraftModScannerExports、 程序目录下的exports和系统临时目录。 - 保存对话框使用 Qt 自带实现,不使用 Windows 原生外壳对话框,避免系统对目标目录的误判。
- 导出菜单提供 快速导出到默认目录,可完全绕过保存对话框。
- 导出菜单提供 打开导出文件夹。
- 如果写入失败,会显示目标路径和具体错误,并提供“改存到默认目录”的兜底选项。
程序不需要管理员权限。如果标准用户下导出被拒绝,请先使用“快速导出到默认目录” 或检查该目录 ACL/受控文件夹访问。临时以管理员身份运行可以绕过部分目录权限, 但会触发 UAC,并可能影响浏览器拉起与拖放;不建议把管理员权限作为长期方案。
本项目没有使用 QXlsx,因此 Excel 功能无需可选依赖,也不会静默缺失。
设置中默认关闭。开启后,在平台检索完成后,对每个有成功结果的行,使用平台返回的模组名称查询 MC百科。
实现位于 src/McModWikiClient.cpp:
- 优先请求非官方 API:
https://mcmod-api.zkitefly.eu.org/s/key=<uriencoded name> - 解析 JSON 数组的
address、title、data.chinese_name、data.sub_name、data.abbr。 - 只取
/class/条目,按名称/缩写/副标题/标题评分,优先精确匹配。 - API 失败或没有匹配时,返回:
https://search.mcmod.cn/s?key=<name> - 限制:单并发、请求启动间隔约 1.2 秒、最多 2 次尝试,遵守 429
Retry-After。 - 失败不影响主检索和导出,只在状态/备注和 MC百科列 tooltip 提示。
参考项目:zkitefly/mcmod-api(非官方,MIT License,数据版权归 MC百科)。
- 配置使用
QSettings的 IniFormat,保存到 Qt 的AppLocalDataLocation/settings.ini。- Windows 通常为
%USERPROFILE%\AppData\LocalLow\MinecraftModScanner\MinecraftModScanner\settings.ini。 - Linux 通常为
~/.local/share/MinecraftModScanner/settings.ini。 - 具体路径由 Qt 的
QStandardPaths决定,程序启动日志会打印该路径。
- Windows 通常为
- 日志位于 Qt 的
AppLocalDataLocation/logs/mcmodscanner.log。- 本机测试路径为
%USERPROFILE%\AppData\LocalLow\MinecraftModScanner\MinecraftModScanner\logs\mcmodscanner.log。 - 单文件超过 2 MB 时会轮转为
.1。
- 本机测试路径为
- 日志只记录平台、查询名、HTTP 状态、耗时、尝试次数和错误码;不记录 API Key、请求头或 User-Agent。
- API Key 默认不持久化。勾选记住后以明文存入 QSettings;程序在保存前会提示风险。
- 建议不要把配置文件或日志上传到公共位置。
核心单元测试覆盖清洗示例、加载器规则、默认值回退、QSettings 持久化、许可证归一化、CSV/Markdown/XLSX 生成:
cmake --build build -j
ctest --test-dir build --output-on-failure或直接运行:
.\build\mcmodscanner_tests.exe可选的实时网络冒烟测试(会访问 Modrinth 与 mcmod-api):
cmake -S . -B build -DMMS_BUILD_NETWORK_TESTS=ON
cmake --build build --target mcmodscanner_network_tests -j
.\build\mcmodscanner_network_tests.exe这些测试默认不启用,避免 CI 依赖外部网络。
可选的界面渲染冒烟测试(使用合成数据,打开主窗口、总结视图、设置和单独检索对话框并截图):
cmake -S . -B build -DMMS_BUILD_UI_TESTS=ON
cmake --build build --target mcmodscanner_ui_tests -j
$env:MMS_UI_SCREENSHOT_DIR = "$PWD\ui-shots"
.\build\mcmodscanner_ui_tests.exe该测试默认关闭,不会影响正式构建。
程序生成的数值统一使用 ASCII 阿拉伯数字 0-9:
- 进度条当前值/总数、成功/未找到/失败计数、尝试次数、HTTP 状态码;
- 设置中的次数、超时、并发、间隔、代理端口;
- 日期和时间,例如
2026-10-23 20:23:19; - 导出文件名时间戳。
实现上启动时固定 QLocale::setDefault(QLocale::c()),QSpinBox/QProgressBar 使用
QLocale::c(),进度文本由 QString::number 直接生成,不再依赖 %v/%m 的本地化替换。
同时为界面指定带阿拉伯数字的 UI 字体族(Segoe UI / Microsoft YaHei UI / Noto Sans 等),
避免系统字体替换导致数字显示成其他符号。
用户原始文件名和 API 返回的原始字段保持原样,不会被改写。
- CurseForge 许可证字段不稳定:CurseForge 搜索响应经常不提供许可证,列会显示“未知”,总结归入“未知许可证”。
- 只按名称检索,并取最相关的一个项目展示;不判断 Minecraft 版本、加载器兼容性、文件版本,不读取 jar 内部的
mods.toml/fabric.mod.json。 - 两个平台名称可能不同,表格按平台分别展示;同一个项目的跨平台映射依赖名称匹配。
- MC百科使用非官方 API,接口可能变更或不可用;匹配使用启发式评分,可能指向同名/相似模组。失败时会回退到搜索页。
- 不支持中文名反向匹配英文项目名(除非平台接口本身返回该名称)。
- Excel 文件使用最小 OOXML 结构,只保证内容与基本样式,不包含公式、图片、复杂格式或图表。
- 不内置 HTTP 代理认证(用户名/密码),仅支持地址和端口。
- 不提供安装包、自动更新或代码签名。
- 日志和数据没有加密;如选择记住 API Key,风险由用户承担。
- 文件名清洗基于 token/尾部标记的启发式规则,极端命名可能误删或漏删;可在
ScanCleaner.cpp中调整版本正则和尾部标记表。 - 打开浏览器依赖操作系统的默认应用关联;若系统未设置默认浏览器,程序会复制链接并提示错误,但无法代替系统修复关联。
- 若系统安全软件或权限策略禁止写入所有可选目录,导出会失败;可使用“快速导出到默认目录”或检查目录权限/受控文件夹访问设置。
- 管理员权限不是必需条件。以管理员身份运行可能绕过部分目录限制,但会增加权限风险,并可能影响默认浏览器启动;优先使用应用数据导出目录。
CMakeLists.txt
build.ps1 Windows 自动构建/测试/部署脚本
README.md
LICENSE CC0 1.0 许可
resources/
app.svg
style.qss
src/
main.cpp
AppConfig.h/.cpp 配置结构、默认值、QSettings 持久化
AppLog.h/.cpp 文件日志
SearchTypes.h/.cpp 平台/状态/结果数据类型
LicenseUtils.h/.cpp 许可证归一化与分组
ScanCleaner.h/.cpp 扫描与文件名清洗
HttpClient.h/.cpp 异步 GET、超时、Retry-After、代理/UA
BasePlatformClient.h/.cpp 平台调度、并发、限速、重试
ModrinthClient.h/.cpp Modrinth 搜索与连通性
CurseForgeClient.h/.cpp CurseForge 搜索、Key 验证
NetworkTaskManager.h/.cpp 两个客户端的管理与信号转发
McModWikiClient.h/.cpp mcmod-api 查询与搜索页回退
ResultModel.h/.cpp 主表格数据模型与导出数据
ActionButtonDelegate.h/.cpp 操作列按钮绘制/点击
ExportService.h/.cpp CSV / Markdown / 内置 XLSX
DetailsDialog.h/.cpp 原始信息/错误详情
UrlLauncher.h/.cpp 默认浏览器打开与失败兜底
SettingsDialog.h/.cpp 设置界面
ManualSearchDialog.h/.cpp 单独检索
SummaryDialog.h/.cpp 总结视图
MainWindow.h/.cpp 主窗口与动作控制
tests/
test_core.cpp 核心单元测试
test_network.cpp 可选实时网络冒烟测试
- 本项目原创源代码:CC0 1.0 Universal(公共领域贡献)
- made by DeepSeek-V4.1-Flash(1017)
- 详见 LICENSE
- Modrinth API
- CurseForge API
- mcmod-api(非官方,MIT)
- Qt 6 遵循其 LGPLv3 / 商业许可;发布时请遵守 Qt 许可并随程序提供相应许可信息。
- MC百科页面内容版权归 MC百科及原编辑者所有;本程序仅链接和展示检索结果摘要,不批量抓取正文。
- CC0 仅覆盖本项目原创源代码,不覆盖上述第三方组件、API、数据或商标。