VisionFlowPro/NodeEditorPro/examples/halcon/HImageFolderModel.cpp
2023-02-28 14:50:28 +08:00

172 lines
3.8 KiB
C++

#include "HImageFolderModel.hpp"
#include <QtCore/QEvent>
#include <QtCore/QDir>
#include <QtWidgets/QFileDialog>
#include <QDebug>
HImageFolderModel::HImageFolderModel()
{
m_image_view = new HImageViewWidget();
m_image_view->resize(200, 200);
m_paraWidget = new QWidget();
m_paraWidget->resize(200, 250);
m_host = new QVBoxLayout();
m_h_host = new QHBoxLayout();
m_paraWidget->setLayout(m_host);
btn_selectFolder = new QPushButton(QStringLiteral("选择目录"));
btn_last = new QPushButton(QStringLiteral("上一张"));
btn_next = new QPushButton(QStringLiteral("下一张"));
btn_selectFolder->setFixedHeight(25);
btn_last->setFixedHeight(25);
btn_next->setFixedHeight(25);
m_h_host->addWidget(btn_last);
m_h_host->addWidget(btn_next);
m_host->addWidget(btn_selectFolder);
m_host->addLayout(m_h_host);
m_host->addWidget(m_image_view);
m_host->setSpacing(1);
m_h_host->setSpacing(1);
m_host->setContentsMargins(0, 0, 0, 0);
m_paraWidget->setContentsMargins(1, 1, 1, 1);
btn_last->installEventFilter(this);
btn_next->installEventFilter(this);
btn_selectFolder->installEventFilter(this);
m_hImageData = std::make_shared<HImageData>();
}
unsigned int HImageFolderModel::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;
}
QJsonObject HImageFolderModel::save() const
{
QJsonObject result = NodeDataModel::save();
result.insert("folderPath", folderPath);
result.insert("curIndex", curIndex);
return result;
}
void HImageFolderModel::restore(QJsonObject const& json_values)
{
//NodeDataModel::restore(json_values);
folderPath = json_values["folderPath"].toString();
curIndex = json_values["curIndex"].toInt(0);
loadImageFolder(folderPath, curIndex);
}
void HImageFolderModel::loadImageFolder(QString path, int index)
{
QDir dir(folderPath);
if (folderPath == "" || !dir.exists())
{
return;
}
HalconCpp::ListFiles(path.toStdString().c_str(), "files", &fileListStr);
TupleRegexpSelect(fileListStr, "\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$", &imgListStr);
imageCounst = imgListStr.Length();
if (imageCounst == 0)
{
return;
}
if (index >= imageCounst)
{
index = 0;
}
curIndex = index;
tmpImg.ReadImage(imgListStr[curIndex].ToTuple());
m_hImageData->setHImage(tmpImg);
m_image_view->showImage(*m_hImageData->hImage());
}
bool HImageFolderModel::eventFilter(QObject* object, QEvent* event)
{
if (object == btn_selectFolder)
{
if (event->type() == QEvent::MouseButtonPress)
{
folderPath = QFileDialog::getExistingDirectory(nullptr,tr("Select Folder"),QDir::homePath());
if (folderPath == "")
{
return false;
}
loadImageFolder(folderPath);
Q_EMIT dataUpdated(0);
return true;
}
else if (event->type() == QEvent::Resize)
{
}
}
else if (object == btn_last)
{
if (event->type() == QEvent::MouseButtonPress)
{
if (curIndex - 1 >= 0)
{
curIndex--;
tmpImg.ReadImage(imgListStr[curIndex].ToTuple());
m_hImageData->setHImage(tmpImg);
m_image_view->showImage(*m_hImageData->hImage());
Q_EMIT dataUpdated(0);
}
else
{
curIndex = imageCounst - 1;
}
}
}
else if (object == btn_next)
{
if (event->type() == QEvent::MouseButtonPress)
{
if (curIndex + 1 < imageCounst)
{
curIndex++;
tmpImg.ReadImage(imgListStr[curIndex].ToTuple());
m_hImageData->setHImage(tmpImg);
m_image_view->showImage(*m_hImageData->hImage());
Q_EMIT dataUpdated(0);
}
else
{
curIndex = 0;
}
}
}
return false;
}
NodeDataType
HImageFolderModel::dataType(PortType, PortIndex) const
{
return HImageData().type();
}
std::shared_ptr<NodeData>
HImageFolderModel::
outData(PortIndex)
{
return std::dynamic_pointer_cast<HImageData>(m_hImageData);
}