添加项目文件。
This commit is contained in:
97
NodeEditorPro/examples/images/ImageLoaderModel.cpp
Normal file
97
NodeEditorPro/examples/images/ImageLoaderModel.cpp
Normal file
@ -0,0 +1,97 @@
|
||||
#include "ImageLoaderModel.hpp"
|
||||
|
||||
#include <QtCore/QEvent>
|
||||
#include <QtCore/QDir>
|
||||
#include <QtWidgets/QFileDialog>
|
||||
|
||||
ImageLoaderModel::
|
||||
ImageLoaderModel()
|
||||
: _label(new QLabel(QStringLiteral("点击加载图片!")))
|
||||
{
|
||||
//_label->setAlignment(Qt::AlignHCenter);
|
||||
|
||||
QFont f = _label->font();
|
||||
f.setBold(true);
|
||||
f.setItalic(true);
|
||||
|
||||
_label->setFont(f);
|
||||
|
||||
_label->setFixedSize(200, 200);
|
||||
|
||||
_label->installEventFilter(this);
|
||||
}
|
||||
|
||||
|
||||
unsigned int
|
||||
ImageLoaderModel::
|
||||
nPorts(PortType portType) const
|
||||
{
|
||||
unsigned int result = 1;
|
||||
|
||||
switch (portType)
|
||||
{
|
||||
case PortType::In:
|
||||
result = 0;
|
||||
break;
|
||||
|
||||
case PortType::Out:
|
||||
result = 1;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool
|
||||
ImageLoaderModel::
|
||||
eventFilter(QObject* object, QEvent* event)
|
||||
{
|
||||
if (object == _label)
|
||||
{
|
||||
int w = _label->width();
|
||||
int h = _label->height();
|
||||
|
||||
if (event->type() == QEvent::MouseButtonPress)
|
||||
{
|
||||
|
||||
QString fileName =
|
||||
QFileDialog::getOpenFileName(nullptr,
|
||||
tr("Open Image"),
|
||||
QDir::homePath(),
|
||||
tr("Image Files (*.png *.jpg *.bmp)"));
|
||||
|
||||
_pixmap = QPixmap(fileName);
|
||||
|
||||
_label->setPixmap(_pixmap.scaled(w, h, Qt::KeepAspectRatio));
|
||||
|
||||
Q_EMIT dataUpdated(0);
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (event->type() == QEvent::Resize)
|
||||
{
|
||||
if (!_pixmap.isNull())
|
||||
_label->setPixmap(_pixmap.scaled(w, h, Qt::KeepAspectRatio));
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
NodeDataType
|
||||
ImageLoaderModel::
|
||||
dataType(PortType, PortIndex) const
|
||||
{
|
||||
return PixmapData().type();
|
||||
}
|
||||
|
||||
|
||||
std::shared_ptr<NodeData>
|
||||
ImageLoaderModel::
|
||||
outData(PortIndex)
|
||||
{
|
||||
return std::make_shared<PixmapData>(_pixmap);
|
||||
}
|
80
NodeEditorPro/examples/images/ImageLoaderModel.hpp
Normal file
80
NodeEditorPro/examples/images/ImageLoaderModel.hpp
Normal file
@ -0,0 +1,80 @@
|
||||
#pragma once
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <QtCore/QObject>
|
||||
#include <QtWidgets/QLabel>
|
||||
|
||||
#include "DataModelRegistry.hpp"
|
||||
#include "NodeDataModel.hpp"
|
||||
|
||||
#include "PixmapData.hpp"
|
||||
|
||||
using QtNodes::PortType;
|
||||
using QtNodes::PortIndex;
|
||||
using QtNodes::NodeData;
|
||||
using QtNodes::NodeDataType;
|
||||
using QtNodes::NodeDataModel;
|
||||
using QtNodes::NodeValidationState;
|
||||
|
||||
/// The model dictates the number of inputs and outputs for the Node.
|
||||
/// In this example it has no logic.
|
||||
class ImageLoaderModel : public NodeDataModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ImageLoaderModel();
|
||||
|
||||
virtual
|
||||
~ImageLoaderModel() {}
|
||||
|
||||
public:
|
||||
|
||||
QString
|
||||
caption() const override
|
||||
{
|
||||
return QStringLiteral("QPixmap输入");
|
||||
}
|
||||
|
||||
QString
|
||||
name() const override { return QStringLiteral("QPixmap输入"); }
|
||||
|
||||
public:
|
||||
|
||||
virtual QString
|
||||
modelName() const
|
||||
{
|
||||
return QStringLiteral("QPixmap输入");
|
||||
}
|
||||
|
||||
unsigned int
|
||||
nPorts(PortType portType) const override;
|
||||
|
||||
NodeDataType
|
||||
dataType(PortType portType, PortIndex portIndex) const override;
|
||||
|
||||
std::shared_ptr<NodeData>
|
||||
outData(PortIndex port) override;
|
||||
|
||||
void
|
||||
setInData(std::shared_ptr<NodeData>, int) override
|
||||
{ }
|
||||
|
||||
QWidget*
|
||||
embeddedWidget() override { return _label; }
|
||||
|
||||
bool
|
||||
resizable() const override { return true; }
|
||||
|
||||
protected:
|
||||
|
||||
bool
|
||||
eventFilter(QObject* object, QEvent* event) override;
|
||||
|
||||
private:
|
||||
|
||||
QLabel* _label;
|
||||
|
||||
QPixmap _pixmap;
|
||||
};
|
110
NodeEditorPro/examples/images/ImageShowModel.cpp
Normal file
110
NodeEditorPro/examples/images/ImageShowModel.cpp
Normal file
@ -0,0 +1,110 @@
|
||||
#include "ImageShowModel.hpp"
|
||||
|
||||
#include <QtCore/QEvent>
|
||||
#include <QtCore/QDir>
|
||||
|
||||
#include <QtWidgets/QFileDialog>
|
||||
|
||||
#include "DataModelRegistry.hpp"
|
||||
|
||||
#include "PixmapData.hpp"
|
||||
|
||||
ImageShowModel::
|
||||
ImageShowModel()
|
||||
: _label(new QLabel("Image will appear here"))
|
||||
{
|
||||
_label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
|
||||
|
||||
QFont f = _label->font();
|
||||
f.setBold(true);
|
||||
f.setItalic(true);
|
||||
|
||||
_label->setFont(f);
|
||||
|
||||
_label->setFixedSize(200, 200);
|
||||
|
||||
_label->installEventFilter(this);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
ImageShowModel::
|
||||
nPorts(PortType portType) const
|
||||
{
|
||||
unsigned int result = 1;
|
||||
|
||||
switch (portType)
|
||||
{
|
||||
case PortType::In:
|
||||
result = 1;
|
||||
break;
|
||||
|
||||
case PortType::Out:
|
||||
result = 1;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
ImageShowModel::
|
||||
eventFilter(QObject* object, QEvent* event)
|
||||
{
|
||||
if (object == _label)
|
||||
{
|
||||
int w = _label->width();
|
||||
int h = _label->height();
|
||||
|
||||
if (event->type() == QEvent::Resize)
|
||||
{
|
||||
auto d = std::dynamic_pointer_cast<PixmapData>(_nodeData);
|
||||
if (d)
|
||||
{
|
||||
_label->setPixmap(d->pixmap().scaled(w, h, Qt::KeepAspectRatio));
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
NodeDataType
|
||||
ImageShowModel::
|
||||
dataType(PortType, PortIndex) const
|
||||
{
|
||||
return PixmapData().type();
|
||||
}
|
||||
|
||||
|
||||
std::shared_ptr<NodeData>
|
||||
ImageShowModel::
|
||||
outData(PortIndex)
|
||||
{
|
||||
return _nodeData;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ImageShowModel::
|
||||
setInData(std::shared_ptr<NodeData> nodeData, PortIndex)
|
||||
{
|
||||
_nodeData = nodeData;
|
||||
|
||||
if (_nodeData)
|
||||
{
|
||||
auto d = std::dynamic_pointer_cast<PixmapData>(_nodeData);
|
||||
|
||||
int w = _label->width();
|
||||
int h = _label->height();
|
||||
|
||||
_label->setPixmap(d->pixmap().scaled(w, h, Qt::KeepAspectRatio));
|
||||
}
|
||||
else
|
||||
{
|
||||
_label->setPixmap(QPixmap());
|
||||
}
|
||||
|
||||
Q_EMIT dataUpdated(0);
|
||||
}
|
80
NodeEditorPro/examples/images/ImageShowModel.hpp
Normal file
80
NodeEditorPro/examples/images/ImageShowModel.hpp
Normal file
@ -0,0 +1,80 @@
|
||||
#pragma once
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <QtCore/QObject>
|
||||
#include <QtWidgets/QLabel>
|
||||
|
||||
#include "DataModelRegistry.hpp"
|
||||
#include "NodeDataModel.hpp"
|
||||
|
||||
using QtNodes::PortType;
|
||||
using QtNodes::PortIndex;
|
||||
using QtNodes::NodeData;
|
||||
using QtNodes::NodeDataType;
|
||||
using QtNodes::NodeDataModel;
|
||||
using QtNodes::NodeValidationState;
|
||||
|
||||
/// The model dictates the number of inputs and outputs for the Node.
|
||||
/// In this example it has no logic.
|
||||
class ImageShowModel : public NodeDataModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ImageShowModel();
|
||||
|
||||
virtual
|
||||
~ImageShowModel() {}
|
||||
|
||||
public:
|
||||
|
||||
QString
|
||||
caption() const override
|
||||
{
|
||||
return QStringLiteral("QPixmap 显示");
|
||||
}
|
||||
|
||||
QString
|
||||
name() const override
|
||||
{
|
||||
return QStringLiteral("QPixmap显示节点");
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
virtual QString
|
||||
modelName() const
|
||||
{
|
||||
return QStringLiteral("QPixmap显示");
|
||||
}
|
||||
|
||||
unsigned int
|
||||
nPorts(PortType portType) const override;
|
||||
|
||||
NodeDataType
|
||||
dataType(PortType portType, PortIndex portIndex) const override;
|
||||
|
||||
std::shared_ptr<NodeData>
|
||||
outData(PortIndex port) override;
|
||||
|
||||
void
|
||||
setInData(std::shared_ptr<NodeData> nodeData, PortIndex port) override;
|
||||
|
||||
QWidget*
|
||||
embeddedWidget() override { return _label; }
|
||||
|
||||
bool
|
||||
resizable() const override { return true; }
|
||||
|
||||
protected:
|
||||
|
||||
bool
|
||||
eventFilter(QObject* object, QEvent* event) override;
|
||||
|
||||
private:
|
||||
|
||||
QLabel* _label;
|
||||
|
||||
std::shared_ptr<NodeData> _nodeData;
|
||||
};
|
35
NodeEditorPro/examples/images/PixmapData.hpp
Normal file
35
NodeEditorPro/examples/images/PixmapData.hpp
Normal file
@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include <QtGui/QPixmap>
|
||||
|
||||
#include "NodeDataModel.hpp"
|
||||
|
||||
using QtNodes::NodeData;
|
||||
using QtNodes::NodeDataType;
|
||||
|
||||
/// The class can potentially incapsulate any user data which
|
||||
/// need to be transferred within the Node Editor graph
|
||||
class PixmapData : public NodeData
|
||||
{
|
||||
public:
|
||||
|
||||
PixmapData() {}
|
||||
|
||||
PixmapData(QPixmap const& pixmap)
|
||||
: _pixmap(pixmap)
|
||||
{}
|
||||
|
||||
NodeDataType
|
||||
type() const override
|
||||
{
|
||||
// id name
|
||||
return { "pixmap", "QPixmap" };
|
||||
}
|
||||
|
||||
QPixmap
|
||||
pixmap() const { return _pixmap; }
|
||||
|
||||
private:
|
||||
|
||||
QPixmap _pixmap{};
|
||||
};
|
55
NodeEditorPro/examples/images/VisionFlowWidget.cpp
Normal file
55
NodeEditorPro/examples/images/VisionFlowWidget.cpp
Normal file
@ -0,0 +1,55 @@
|
||||
#include "VisionFlowWidget.hpp"
|
||||
|
||||
VisionFlowWidget::VisionFlowWidget(QWidget* parent)
|
||||
{
|
||||
main_layout = new QVBoxLayout();
|
||||
header_layout = new QHBoxLayout();
|
||||
btn_load_scheme = new QPushButton("Load");
|
||||
btn_save_scheme = new QPushButton("Save");
|
||||
btn_clear_scene = new QPushButton("Clear");
|
||||
btn_test = new QPushButton("test");
|
||||
header_layout->setAlignment(Qt::AlignLeft);
|
||||
btn_load_scheme->setFixedWidth(120);
|
||||
btn_save_scheme->setFixedWidth(120);
|
||||
btn_clear_scene->setFixedWidth(120);
|
||||
this->setLayout(main_layout);
|
||||
main_layout->addLayout(header_layout);
|
||||
header_layout->addWidget(btn_load_scheme);
|
||||
header_layout->addWidget(btn_save_scheme);
|
||||
header_layout->addWidget(btn_clear_scene);
|
||||
header_layout->addWidget(btn_test);
|
||||
header_layout->setContentsMargins(0, 0, 0, 0);
|
||||
main_layout->setContentsMargins(1, 1, 1, 1);
|
||||
main_layout->setSpacing(1);
|
||||
m_scene = new FlowScene(registerDataModels());
|
||||
m_view = new FlowView(m_scene);
|
||||
main_layout->addWidget(m_view);
|
||||
this->setWindowTitle(QStringLiteral("节点编辑器"));
|
||||
this->resize(1280, 720);
|
||||
setConnection();
|
||||
}
|
||||
|
||||
VisionFlowWidget::~VisionFlowWidget()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void VisionFlowWidget::setConnection()
|
||||
{
|
||||
connect(btn_load_scheme, &QPushButton::clicked, [=]()
|
||||
{
|
||||
m_scene->load();
|
||||
});
|
||||
connect(btn_save_scheme, &QPushButton::clicked, [=]()
|
||||
{
|
||||
m_scene->save();
|
||||
});
|
||||
connect(btn_clear_scene, &QPushButton::clicked, [=]()
|
||||
{
|
||||
m_scene->clearScene();
|
||||
});
|
||||
connect(btn_test, &QPushButton::clicked, [=]()
|
||||
{
|
||||
DrawShapeView::getInst()->show();
|
||||
});
|
||||
}
|
95
NodeEditorPro/examples/images/VisionFlowWidget.hpp
Normal file
95
NodeEditorPro/examples/images/VisionFlowWidget.hpp
Normal file
@ -0,0 +1,95 @@
|
||||
#pragma once
|
||||
|
||||
#include "NodeData.hpp"
|
||||
#include "FlowScene.hpp"
|
||||
#include "FlowView.hpp"
|
||||
#include <QString>
|
||||
#include <QStringLiteral>
|
||||
#include <QtWidgets/QApplication>
|
||||
#include <QIcon>
|
||||
#include <QImage>
|
||||
|
||||
#include "ImageShowModel.hpp"
|
||||
#include "ImageLoaderModel.hpp"
|
||||
#include "DrawShapeView.hpp"
|
||||
#include "halcon/HalconNodes.hpp"
|
||||
#include "calculator/MathNodes.hpp"
|
||||
|
||||
//#include "opcv/CvImageLoaderModel.h"
|
||||
//#include "opcv/CvImageShowModel.h"
|
||||
#include "opcv/MoudleOpencvNodes.h"
|
||||
|
||||
using QtNodes::DataModelRegistry;
|
||||
using QtNodes::FlowScene;
|
||||
using QtNodes::FlowView;
|
||||
|
||||
|
||||
class VisionFlowWidget :public QWidget
|
||||
{
|
||||
public:
|
||||
VisionFlowWidget(QWidget* parent = Q_NULLPTR);
|
||||
virtual ~VisionFlowWidget();
|
||||
private:
|
||||
QVBoxLayout* main_layout;
|
||||
QHBoxLayout* header_layout;
|
||||
QPushButton* btn_load_scheme;
|
||||
QPushButton* btn_save_scheme;
|
||||
QPushButton* btn_clear_scene;
|
||||
QPushButton* btn_test;
|
||||
FlowScene* m_scene;
|
||||
FlowView* m_view;
|
||||
//DrawShapeView* m_draw_shape_view;
|
||||
private:
|
||||
void setConnection();
|
||||
};
|
||||
|
||||
static std::shared_ptr<DataModelRegistry> registerDataModels()
|
||||
{
|
||||
QString numberNodeType = QStringLiteral("数学操作");
|
||||
QString halconImageNodeType = QStringLiteral("Halcon图像操作");
|
||||
QString getHalconImageNodeType = QStringLiteral("获取Halcon图像");
|
||||
QString dlNodeType = QStringLiteral("深度学习");
|
||||
QString matchNodeType = QStringLiteral("模板匹配");
|
||||
|
||||
QString getOpencvImageNodeType = QStringLiteral("00.获取OpenCV图像");
|
||||
QString opencvImageNodeType = QStringLiteral("01.OpenCV图像操作");
|
||||
|
||||
auto ret = std::make_shared<DataModelRegistry>();
|
||||
|
||||
//opencv图像获取
|
||||
ret->registerModel<CvImageLoaderModel>(getOpencvImageNodeType);
|
||||
|
||||
//opencv图像操作
|
||||
ret->registerModel<CvImageShowModel>(opencvImageNodeType);
|
||||
ret->registerModel<CvGraphicsShowModel>(opencvImageNodeType);
|
||||
ret->registerModel<CvImageRGB2GrayModel>(opencvImageNodeType);
|
||||
|
||||
//数学节点
|
||||
ret->registerModel<AdditionModel>(numberNodeType);
|
||||
ret->registerModel<DivisionModel>(numberNodeType);
|
||||
ret->registerModel<MultiplicationModel>(numberNodeType);
|
||||
ret->registerModel<SubtractionModel>(numberNodeType);
|
||||
ret->registerModel<NumberSourceDataModel>(numberNodeType);
|
||||
ret->registerModel<NumberDisplayDataModel>(numberNodeType);
|
||||
|
||||
//图像获取
|
||||
ret->registerModel<HImageLoaderModel>(getHalconImageNodeType);
|
||||
//ret->registerModel<HImageFolderModel>(getHalconImageNodeType);
|
||||
//图像操作
|
||||
ret->registerModel<HImageShowModel>(halconImageNodeType);
|
||||
ret->registerModel<HImageRGB2GrayModel>(halconImageNodeType);
|
||||
ret->registerModel<HImageSplitChanelModel>(halconImageNodeType);
|
||||
ret->registerModel<HImageThresholdModel>(halconImageNodeType);
|
||||
//ret->registerModel<HRegionSelectModel>(halconImageNodeType);
|
||||
ret->registerModel<HRegionConnectModel>(halconImageNodeType);
|
||||
ret->registerModel<HRegionShapeTransModel>(halconImageNodeType);
|
||||
ret->registerModel<HImageReduceDomainModel>(halconImageNodeType);
|
||||
ret->registerModel<HRegionFillUpShapeModel>(halconImageNodeType);
|
||||
ret->registerModel<HRegionOpenCircleModel>(halconImageNodeType);
|
||||
ret->registerModel<HRegionUnionModel>(halconImageNodeType);
|
||||
ret->registerModel<HRegionDifferenceModel>(halconImageNodeType);
|
||||
ret->registerModel<HRegionSelectShapeStdModel>(halconImageNodeType);
|
||||
ret->registerModel<HImageDLSegmentModel>(halconImageNodeType);
|
||||
|
||||
return ret;
|
||||
}
|
22
NodeEditorPro/examples/images/main.cpp
Normal file
22
NodeEditorPro/examples/images/main.cpp
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
#include <QtWidgets/QApplication>
|
||||
#include <QtWidgets/QStyleFactory>
|
||||
#include "VisionFlowWidget.hpp"
|
||||
|
||||
#include "QBreakpadHandler.h"
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
app.setWindowIcon(QIcon(":/logo.png"));
|
||||
QStyle* style = QStyleFactory::create("Fusion");
|
||||
app.setStyle(style);
|
||||
|
||||
VisionFlowWidget* mainWidget = new VisionFlowWidget();
|
||||
mainWidget->show();
|
||||
|
||||
QBreakpadInstance.setDumpPath("crash");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
|
Reference in New Issue
Block a user