EEditor 案例

PluginNetTools

局域网设备扫描工具
C++ 定义数据模型,Python 执行扫描,结果自动注入树视图

❓ 问题

快速发现局域网内活跃设备及其操作系统类型。传统方式需要手动运行 nmap 等工具,解析输出繁琐。

💡 方案

C++ 插件定义 ENetDevice 数据模型,点击按钮后在后台线程启动 Python 脚本进行 ICMP 并行扫描,实时解析结果,扫描完成后通过主线程轮询刷新树视图。

📸 请放置截图 → images/screenshot_nettools_scan.png

局域网扫描完成后的树视图,展示发现的活跃设备及其 IP 和操作系统类型

核心机制

最小侵入式扩展模式

定义 EItem → 调用脚本 → 注入结果。C++ 插件核心代码约 50 行,业务逻辑外包给 Python 脚本(~250 行),展示了 EEditor 的极致扩展性。

执行流程

定义 ENetDevice → 点击扫描按钮 → 后台启动 Python → 实时 stdout 回调 → 主线程刷新树视图
C++ 50 行 + Python 250 行 实时 stdout 回调 std::atomic + falling-edge 检测 EMainThreadPolling 主线程调度 ICMP 并行扫描
// C++ 插件核心 —— 仅需定义数据模型 class ENetDevice : public EItem { public: EString ui_ip; // 设备 IP 地址 EString ui_deviceType; // 操作系统类型 }; // 扫描按钮回调 —— 启动 Python 脚本 void onScanClicked() { // 后台线程执行 Python 脚本 processManager->start("python3 pyScanLocalNet.py", // stdout 回调:实时解析 [UP] 行 [](const EString& line) { if (line.contains("[UP]")) { // 解析 IP 和设备类型 scanResults.push_back(parseResult(line)); } } ); }

线程安全与 UI 更新

利用 std::atomic<bool> + 主线程轮询的 falling-edge 检测优雅处理"线程完成 → UI 更新"的时序问题。Python 脚本在独立线程执行,stdout 回调实时解析结果,扫描完成后主线程批量创建设备节点并刷新树视图。

📸 请放置截图 → images/screenshot_plugin_structure.png

典型插件的文件结构 —— 事件处理、数据模型、入口注册、CMake 构建脚本

下载 PluginNetTools

获取 PluginNetTools 插件的预编译版本,包含 C++ 插件和 Python 扫描脚本。

⬇ 下载插件