
UI组件数据可视化【免费下载链接】nodeeditorQt Node Editor. Dataflow programming framework项目地址https://gitcode.com/gh_mirrors/no/nodeeditor点击查看免费下载导读本文基于 QtNodesQt Node EditorDataflow programming framework官方文档《Quick Start》整理而成并补充了仓库源码级的实现细节。你将学会如何以不到 50 行代码从零搭建一个可交互的节点图编辑器在画布上显示节点、通过右键菜单创建节点、在端口之间拖拽连线以及选中、移动、删除节点。读完本文你可以独立完成一个最小可用的节点图编辑器并理解AbstractGraphModel、BasicGraphicsScene、GraphicsView三者的协作关系为后续接入数据流Data Flow与自定义样式打下基础。最终构建出的节点图编辑器运行效果我们要构建什么本教程构建一个最小化的图形编辑器它具备以下能力在画布canvas上显示节点通过右键菜单创建新节点通过在端口之间拖拽来连接节点支持选中、移动和删除节点。整个编辑器的核心由三个部分构成图模型Graph Model、场景Scene与视图View。模型负责存储节点与连线的数据场景负责把它们渲染成图形对象视图负责显示与交互。这与 Qt 经典的 Model-View 架构一脉相承。前置准备安装 QtNodes在动手之前需要先构建并安装 QtNodes 库。官方安装文档docs/getting-started/installation.rst给出了明确要求Qt5.15 或 Qt 6.xQt SVG 模块用于处理处理状态图标CMake3.11支持C17的编译器GCC 7、Clang 5、MSVC 2019Catch2可选仅运行单元测试时需要Ubuntu/Debian 下安装 Qt SVG 模块# 对于 Qt6 sudo apt install libqt6svg6 # 对于 Qt5 sudo apt install libqt5svg5从源码构建git clone https://github.com/paceholder/nodeeditor.git cd nodeeditor mkdir build cd build cmake .. cmake --build .仓库根目录的 CMakeLists.txt 提供了几个关键构建选项来自安装文档的参数表选项默认值说明USE_QT6ON使用 Qt6 构建设为OFF则使用 Qt5BUILD_SHARED_LIBSON构建为共享库设为OFF则构建静态库BUILD_TESTINGON构建单元测试需要 Catch2BUILD_EXAMPLESON构建示例应用常用组合示例# 使用 Qt5 构建 cmake .. -DUSE_QT6OFF # 构建静态库 cmake .. -DBUILD_SHARED_LIBSOFF # 跳过测试未安装 Catch2 时 cmake .. -DBUILD_TESTINGOFF也可以把 QtNodes 以 CMake 子目录方式集成进你自己的工程或安装后通过find_package(QtNodes REQUIRED)使用详见安装文档中的Integration into Your Project一节。本教程示例本身就是随仓库一起构建的对应的构建目标位于 examples/simple_graph_model/CMakeLists.txt。Step 1创建图模型SimpleGraphModel首先要创建一个类来存储我们的图数据。新建SimpleGraphModel.hpp#pragma once #include QtNodes/AbstractGraphModel #include unordered_set #include unordered_map class SimpleGraphModel : public QtNodes::AbstractGraphModel { Q_OBJECT public: // Required: Generate unique node IDs QtNodes::NodeId newNodeId() override { return _nextId; } // Required: Return all node IDs std::unordered_setQtNodes::NodeId allNodeIds() const override; // Required: Return all connections for a node std::unordered_setQtNodes::ConnectionId allConnectionIds(QtNodes::NodeId) const override; // ... (完整实现见 examples/simple_graph_model) private: QtNodes::NodeId _nextId 0; std::unordered_setQtNodes::NodeId _nodes; std::unordered_setQtNodes::ConnectionId _connections; };该模型继承自AbstractGraphModel需要存储三类数据一组节点 ID一组连线每条连线连接两个端口节点位置及其他元数据位置、尺寸等。提示完整的实现见 examples/simple_graph_model/SimpleGraphModel.cpp大约 150 行实现了全部必需的虚函数。源码深入AbstractGraphModel的契约从仓库中的 include/QtNodes/internal/AbstractGraphModel.hpp 可以看到AbstractGraphModel是 Model-View 架构中的核心抽象类。文档注释明确说明它为底层用户数据结构表示图的那些数据提供各种信息并允许修改图结构创建和移除节点与连线同时强调所有节点 ID 都由模型自己负责生成库本身不为你管理 ID。真正写完整的模型需要覆写的纯虚函数包括虚函数职责newNodeId()生成新的唯一NodeId无符号整数allNodeIds()返回全部节点 ID 集合allConnectionIds(nodeId)返回与某节点相关的全部连线 IDconnections(nodeId, portType, portIndex)返回某个端口上连接的对端connectionExists(connectionId)判断连线是否存在addNode(nodeType)新增节点返回新NodeIdconnectionPossible(connectionId)判断两个端口是否可以相连addConnection(connectionId)建立连线nodeExists(nodeId)/deleteNode(nodeId)节点存在性判断 / 删除节点nodeData(...)/setNodeData(...)读取 / 设置节点数据通过NodeRoleportData(...)/setPortData(...)读取 / 设置端口数据通过PortRoledeleteConnection(connectionId)删除连线saveNode(...)/loadNode(...)节点序列化用于保存/撤销/恢复以SimpleGraphModel.cpp中的实现为例可以看到模型改动图结构后如何通知场景。例如addNode在插入新 ID 后发出信号NodeId SimpleGraphModel::addNode(QString const nodeType) { NodeId newId newNodeId(); _nodeIds.insert(newId); Q_EMIT nodeCreated(newId); // 通知场景新节点诞生 return newId; }addConnection则发出connectionCreated(connectionId)deleteConnection发出connectionDeleted(connectionId)setNodeData修改位置后发出nodePositionUpdated(nodeId)。这些信号正是 AbstractGraphModel.hpp 中声明的Q_SIGNALS还包括nodeUpdated、nodeDeleted、modelReset等BasicGraphicsScene监听它们来同步渲染。在派生模型里必须发出相应信号否则场景不会感知图的变化。此外connectionPossible的默认语义是两端数据不冲突即可相连模型可以覆写它来施加自定义规则而saveNode/loadNode支持 JSON 序列化loadNode会从nodeJson中恢复节点 ID 与位置并用_nextNodeId std::max(_nextNodeId, restoredNodeId 1)保证新生成的 ID 不会与已恢复的 ID 冲突。Step 2创建主窗口main.cpp创建main.cpp#include QApplication #include QtNodes/GraphicsView #include QtNodes/BasicGraphicsScene #include SimpleGraphModel.hpp int main(int argc, char* argv[]) { QApplication app(argc, argv); // 1. Create the graph model SimpleGraphModel model; // 2. Create a scene that visualizes the model auto* scene new QtNodes::BasicGraphicsScene(model); // 3. Create a view to display the scene QtNodes::GraphicsView view(scene); view.setWindowTitle(My First Node Graph); view.resize(800, 600); view.show(); return app.exec(); }仓库中完整的示例 examples/simple_graph_model/main.cpp 与上述骨架一致并额外做了两件事一是在进入事件循环前就预置两个节点和一条连线NodeId id1 graphModel.addNode(); graphModel.setNodeData(id1, NodeRole::Position, QPointF(0, 0)); NodeId id2 graphModel.addNode(); graphModel.setNodeData(id2, NodeRole::Position, QPointF(300, 300)); graphModel.addConnection(ConnectionId{id1, 0, id2, 0});ConnectionId{id1, 0, id2, 0}的含义是从节点id1的 0 号输出端口连接到节点id2的 0 号输入端口。二是把窗口居中到屏幕中央view.move(...)。由此可以看出三条最基本的模型操作调用链addNode()创建节点、setNodeData(…, NodeRole::Position, …)设置位置、addConnection(…)建立连线而场景与视图会负责把这一切画出来。Step 3添加节点创建功能让用户通过右键菜单创建节点// After creating the view... view.setContextMenuPolicy(Qt::ActionsContextMenu); QAction* createAction new QAction(Create Node, view); QObject::connect(createAction, QAction::triggered, []() { // Get mouse position in scene coordinates QPointF pos view.mapToScene(view.mapFromGlobal(QCursor::pos())); // Add node to model auto nodeId model.addNode(); model.setNodeData(nodeId, QtNodes::NodeRole::Position, pos); }); view.addAction(createAction);这里的关键点在于坐标转换QCursor::pos()是全局屏幕坐标先经view.mapFromGlobal(...)转成视图部件坐标再经view.mapToScene(...)转成场景坐标这样新节点才能精确出现在鼠标所在的位置。在 examples/simple_graph_model/main.cpp 中这个动作被插入到现有动作列表的最前面view.insertAction(view.actions().front(), createNodeAction)使Create Node出现在右键菜单顶部。Step 4构建并运行工程的CMakeLists.txt如下find_package(QtNodes REQUIRED) add_executable(my_first_graph main.cpp SimpleGraphModel.cpp) target_link_libraries(my_first_graph QtNodes::QtNodes)构建并运行mkdir build cd build cmake .. make ./my_first_graph需要说明find_package(QtNodes REQUIRED)要求 QtNodes 已安装到系统即执行过cmake --install .或者已通过add_subdirectory集成。仓库内的示例 examples/simple_graph_model/CMakeLists.txt 采用子目录方式先file(GLOB_RECURSE CPPS ./*.cpp)收集源文件再add_executable(simple_graph_model ${CPPS} ${HPPS})并target_link_libraries(simple_graph_model QtNodes)。注意 QtNodes 库目标使用Q_OBJECT宏根 CMakeLists.txt 已全局开启CMAKE_AUTOMOC因此你自己的工程若手动编写 CMake也需要启用 AUTOMOC 才能正确编译含Q_OBJECT的模型类。与你的图交互运行程序后你可以通过以下方式与图交互创建Create在画布上右键选择 Create Node 即可在鼠标位置创建新节点连接Connect从一个端口拖拽到另一个端口建立连线选中Select单击节点或拖拽出框选区域批量选择。通过右键菜单在鼠标位置创建新节点从端口拖拽到另一端口创建连线快捷键Delete—— 删除选中的节点/连线CtrlZ—— 撤销CtrlShiftZ—— 重做CtrlD—— 复制选中的内容这些撤销/重做与复制粘贴能力并非编辑器自动获得的而是由仓库中的UndoCommands与BasicGraphicsScene共同提供实现见 src/UndoCommands.cpp 与 include/QtNodes/BasicGraphicsScene前提是你的模型正确实现了saveNode/loadNode等接口。底层原理模型、场景、视图如何协作本教程虽然只写了 50 行代码背后却是完整的 Model-View 架构详见 docs/getting-started/concepts.rstGraphicsView (QGraphicsView) └── BasicGraphicsScene (QGraphicsScene) ├── NodeGraphicsObject 每个节点一个 └── ConnectionGraphicsObject 每条连线一个模型Model你的数据节点、连线、位置等SimpleGraphModel是它的实现库不持有你的数据数据所有权始终在你手中场景SceneBasicGraphicsScene继承自QGraphicsScene监听模型的信号把每个节点/连线实例化为图形对象NodeGraphicsObject/ConnectionGraphicsObject视图ViewGraphicsView继承自QGraphicsView负责绘制与鼠标/键盘交互。这种分离带来几个实用好处可以在无 GUI 的 headless 模式下运行图逻辑仓库提供了 examples/calculator/headless_main.cpp 作为证据同一份数据可以拥有多个视图图逻辑更容易做单元测试。模型与场景之间通过NodeRole/PortRole交换数据类似 Qt 的ItemDataRole。SimpleGraphModel.cpp中的nodeData实现覆盖了NodeRole::Position、NodeRole::Size、NodeRole::Caption、NodeRole::InPortCount、NodeRole::OutPortCount、NodeRole::Style等角色——例如每个节点默认有 1 个输入端口和 1 个输出端口InPortCount/OutPortCount均返回1u默认标题为 Node而portData则通过PortRole::Caption返回 Port In / Port Out。这套角色体系是模型自定义外观与行为的主要扩展点。下一步你已经构建出一个基本的图编辑器。接下来可以沿着官方文档继续深入docs/getting-started/concepts.rst —— 理解 Model-View 架构与 NodeRole/PortRole 的完整设计docs/guide/data-flow.rst —— 让数据在节点之间流动Data Flow 模型docs/guide/styling.rst —— 定制外观与样式docs/examples/index.rst —— 探索仓库中的完整示例计算器、动态端口、自定义画笔、节点校验等。其中 examples/calculator 是最值得研读的进阶范例它在SimpleGraphModel的基础上叠加了NodeDelegateModel委托体系让节点真正处理输入、产生输出是通往数据流编程框架的下一步。赞分享UI组件数据可视化【免费下载链接】nodeeditorQt Node Editor. Dataflow programming framework项目地址https://gitcode.com/gh_mirrors/no/nodeeditor点击查看免费下载相关推荐QtNodes终极指南构建专业级节点编辑器QtNodes终极指南构建专业级节点编辑器 在当今的可视化开发领域节点编辑器已成为数据流编程和图形界面设计的核心工具。QtNodes作为基于Qt框架的专业节UI组件数据可视化QtNodes基于Qt的强大节点编辑器框架QtNodes基于Qt的强大节点编辑器框架 在当今的可视化编程领域节点编辑器已成为构建复杂图形系统的核心工具。QtNodes是一个基于Qt的通用库专门设计UI组件数据可视化**深度探索QtNodes——构建强大的节点编辑器**深度探索QtNodes——构建强大的节点编辑器 一、项目简介 在众多图形编程和数据流可视化工具中有一个项目凭借其强大而灵活的功能脱颖而出——QtNodes。UI组件数据可视化上一篇终极指南如何轻松管理3DS Homebrew应用Universal-Updater完全教程下一篇如何用VideoDownloadHelper轻松下载网页视频新手必备的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考