QtNode是一个基于 Qt 的通用库,旨在为各种应用程序开发节点编辑器。该库可用于简单的图形可视化和编辑,或进一步扩展以使用数据流范例。
源码路径:https://github.com/paceholder/nodeeditor
目的:基于此QtNode,再结合计算机视觉常用库,例如opencv, halcon, libtorch等,可以开发出工业视觉算法软件。该软件可以根据不同的项目需求,搭建对应的节点组合,可以快速解决问题而无需算法人员参与。
例子:这里以官方给的计算器功能为例。界面如下。
通过拖动加法算子,可以实现加法运算。
计算器的主函数
#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" // 输入节点