nodeeditor 源码阅读

QtNode是一个基于 Qt 的通用库,旨在为各种应用程序开发节点编辑器。该库可用于简单的图形可视化和编辑,或进一步扩展以使用数据流范例。

源码路径:https://github.com/paceholder/nodeeditor

目的:基于此QtNode,再结合计算机视觉常用库,例如opencv, halcon, libtorch等,可以开发出工业视觉算法软件。该软件可以根据不同的项目需求,搭建对应的节点组合,可以快速解决问题而无需算法人员参与。

例子:这里以官方给的计算器功能为例。界面如下。

3e5f9871d6546d31047a24eaddcbc302.png

通过拖动加法算子,可以实现加法运算。

170c4fdaa21b59d9148aedc3ff212d4c.png

计算器的主函数

#include <QtNodes/ConnectionStyle>              // 1, 设置风格
#include <QtNodes/DataFlowGraphModel>           // 2, 控制多个节点
#include <QtNodes/DataFlowGraphicsScene>        // 3, 控制flow
#include <QtNodes/GraphicsView>                 // 4, 控制视图
#include <QtNodes/NodeDelegateModelRegistry>    // 5, 算子注册器


#include <QtGui/QScreen>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QVBoxLayout>
#include <QtGui/QScreen>


// 待注册的6个模块
#include "AdditionModel.hpp"
#include "DivisionModel.hpp"
#include "MultiplicationModel.hpp"
#include "SubtractionModel.hpp"


#include "NumberDisplayDataModel.hpp"
#include "NumberSourceDataModel.hpp"


using QtNodes::ConnectionStyle;              // 1, 设置风格
using QtNodes::DataFlowGraphModel;           // 2, 控制多个节点 
using QtNodes::DataFlowGraphicsScene;        // 3, 控制flow
using QtNodes::GraphicsView;                 // 4, 控制视图
using QtNodes::NodeDelegateModelRegistry;    // 5, 算子注册器
                                            
static std::shared_ptr<NodeDelegateModelRegistry> registerDataModels()
{
    auto ret = std::make_shared<NodeDelegateModelRegistry>();
    ret->registerModel<NumberSourceDataModel>("Sources");


    ret->registerModel<NumberDisplayDataModel>("Displays");


    ret->registerModel<AdditionModel>("Operators");


    ret->registerModel<SubtractionModel>("Operators");


    ret->registerModel<MultiplicationModel>("Operators");


    ret->registerModel<DivisionModel>("Operators");


    return ret;
}


static void setStyle()
{
    ConnectionStyle::setConnectionStyle(
        R"(
  {
    "ConnectionStyle": {
      "ConstructionColor": "gray",
      "NormalColor": "black",
      "SelectedColor": "gray",
      "SelectedHaloColor": "deepskyblue",
      "HoveredColor": "deepskyblue",


      "LineWidth": 3.0,
      "ConstructionLineWidth": 2.0,
      "PointDiameter": 10.0,


      "UseDataDefinedColors": true
    }
  }
  )");
}


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);


    // 1, 设置风格
    setStyle();


    // 2, 垂直布局的主界面:菜单栏,中间GraphicsView
    QWidget mainWidget;
    QVBoxLayout* l = new QVBoxLayout(&mainWidget);
    auto menuBar = new QMenuBar();
    QMenu* menu = menuBar->addMenu("File");
    auto saveAction = menu->addAction("Save Scene");
    auto loadAction = menu->addAction("Load Scene");
    l->addWidget(menuBar);


    // 中间GraphicsView
    std::shared_ptr<NodeDelegateModelRegistry> registry = registerDataModels();  // 注册算子模块
    DataFlowGraphModel dataFlowGraphModel(registry);  // 控制节点
    auto scene = new DataFlowGraphicsScene(dataFlowGraphModel, &mainWidget);  // 控制flow
    auto view = new GraphicsView(scene);  // 控制视图
    l->addWidget(view);
    l->setContentsMargins(0, 0, 0, 0);
    l->setSpacing(0);


    QObject::connect(saveAction, &QAction::triggered, scene, &DataFlowGraphicsScene::save);
    QObject::connect(loadAction, &QAction::triggered, scene, &DataFlowGraphicsScene::load);
    QObject::connect(scene, &DataFlowGraphicsScene::sceneLoaded, view, &GraphicsView::centerScene);  // 加载之后要居中


    mainWidget.setWindowTitle("Data Flow: simplest calculator");
    mainWidget.resize(800, 600);
    // Center window.
    mainWidget.move(QApplication::primaryScreen()->availableGeometry().center()
                    - mainWidget.rect().center());
    mainWidget.showNormal();


    return app.exec();
}

后续会继续学习如何将上面的6个功能,打包成模块的。6个模块有:

// 待注册的6个模块
#include "AdditionModel.hpp"         // 加减乘除
#include "SubtractionModel.hpp"
#include "MultiplicationModel.hpp"
#include "DivisionModel.hpp"         


#include "NumberDisplayDataModel.hpp"  // 显示结果
#include "NumberSourceDataModel.hpp"   // 输入节点
nodeeditor是一个基于Qt的节点编辑器,用于数据流编程框架。它提供了一个可视化的界面,让用户可以通过连接不同的节点来构建数据流图。每个节点代表一个特定的功能或操作,而连接则表示数据的流动。 在nodeeditor中,用户可以创建自定义的节点,并定义节点之间的连接规则。每个节点可以有输入和输出端口,用于接收和发送数据。用户可以通过拖拽和连接不同的节点来构建数据流图,并通过节点之间的连接来传递数据。 nodeeditor还提供了一些常用的连接风格类,如ConnectionStyle,用于定义节点之间连接的样式和外观。用户可以根据自己的需求自定义连接的样式,以使数据流图更加直观和易于理解。 以下是一个简单的示例,演示了如何使用nodeeditor创建一个简单的数据流图: ```python from nodeeditor.node_editor_widget import NodeEditorWidget from nodeeditor.utils import dumpException try: # 创建一个节点编辑器窗口 nodeEditor = NodeEditorWidget() # 创建两个节点 node1 = nodeEditor.createNode("Node", pos=(80, 80)) node2 = nodeEditor.createNode("Node", pos=(320, 80)) # 创建连接 nodeEditor.createConnection(node1.outputs()[0], node2.inputs()[0]) # 显示节点编辑器窗口 nodeEditor.show() except Exception as e: dumpException(e) ``` 这个示例创建了一个包含两个节点的数据流图,节点之间通过连接进行数据传递。你可以根据自己的需求添加更多的节点和连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值