diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index 9be4330..bea44f1 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -33,6 +33,9 @@ HPPA::HPPA(QWidget* parent) mConfigfile.parseConfigfile(); qDebug() << "exist: " << QString::fromStdString(HPPACfgFile); + // Create MapLayerStore early so created layers are managed + m_MapLayerStore = new MapLayerStore(this); + /*int max, min; mConfigfile.getPositionRestriction(max, min); @@ -73,7 +76,6 @@ HPPA::HPPA(QWidget* parent) - initMenubarToolbar(); @@ -214,16 +216,16 @@ sizePolicy1.setHeightForWidth(graphicsView_delete->sizePolicy().hasHeightForWidt // 创建并保留 Raster 分组指针,后续添加 layer 使用它 m_RasterGroup = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Raster"); - { - auto* ln1 = new LayerTreeLayerNode(nullptr); - ln1->setName("tmp_image_1"); - m_LayerTreeModel->addLayer(m_RasterGroup, ln1); - } - { - auto* ln2 = new LayerTreeLayerNode(nullptr); - ln2->setName("tmp_image_2"); - m_LayerTreeModel->addLayer(m_RasterGroup, ln2); - } + //{ + // auto* ln1 = new LayerTreeLayerNode(nullptr); + // ln1->setName("tmp_image_1"); + // m_LayerTreeModel->addLayer(m_RasterGroup, ln1); + //} + //{ + // auto* ln2 = new LayerTreeLayerNode(nullptr); + // ln2->setName("tmp_image_2"); + // m_LayerTreeModel->addLayer(m_RasterGroup, ln2); + //} auto* g2 = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Vector"); //model->addLayer(g2, "Rivers"); @@ -724,7 +726,7 @@ void HPPA::initControlTabwidget() //2轴马达控制 m_tmc = new TwoMotorControl(this); - connect(m_tmc, SIGNAL(startLineNumSignal(int)), this, SLOT(onCreateTab(int))); + //connect(m_tmc, SIGNAL(startLineNumSignal(int)), this, SLOT(onCreateTab(int))); connect(m_tmc, SIGNAL(sequenceComplete()), this, SLOT(onsequenceComplete())); m_tmc->setWindowFlags(Qt::Widget); ui.controlTabWidget->addTab(m_tmc, QString::fromLocal8Bit("2轴控制")); @@ -750,7 +752,7 @@ void HPPA::recordFromRobotArm(int fileCounter) m_imageViewerTabWidget->clear(); } - onCreateTab(fileCounter - 1); + onCreateTab("img"); emit StartRecordSignal(); ui.action_start_recording->setText(QString::fromLocal8Bit("采集中")); @@ -1029,8 +1031,6 @@ void HPPA::onStartRecordStep1() { m_imageViewerTabWidget->clear(); - onCreateTab(0); - m_Imager->setFileName2Save(imgPath); m_Imager->setFrameNumber(this->frame_number->text().toInt()); emit StartRecordSignal();//发射开始采集信号 @@ -1056,10 +1056,8 @@ void HPPA::onStartRecordStep1() { m_imageViewerTabWidget->clear(); - onCreateTab(0); - ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集")); - ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}"); + ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}"); //应该先控制马达运动,当马达运动后,再开始光谱仪采集(发射开始采集信号) m_Imager->setFileName2Save(imgPath); @@ -1117,24 +1115,20 @@ void HPPA::onStartRecordStep1() } } -void HPPA::onCreateTab(int trackNumber) +QWidget* HPPA::onCreateTab(QString tabName) { - if (trackNumber >= 0) - { - m_numberOfRecording = trackNumber; + QWidget* tabTmp = new QWidget(); - QWidget* tabTmp = new QWidget(); + QGridLayout* GridLayout = new QGridLayout(); + GridLayout->addWidget(new Mapcavas(tabTmp)); - QGridLayout* GridLayout = new QGridLayout(); - GridLayout->addWidget(new mapcavas(tabTmp)); + tabTmp->setLayout(GridLayout); - tabTmp->setLayout(GridLayout); + m_imageViewerTabWidget->addTab(tabTmp, tabName); - m_imageViewerTabWidget->addTab(tabTmp, QString::number(trackNumber + 1)); - - m_imageViewerTabWidget->setCurrentIndex(trackNumber); - } + m_imageViewerTabWidget->setCurrentIndex(m_imageViewerTabWidget->count() - 1); + return tabTmp; } void HPPA::onTabWidgetCurrentChanged(int index)//代码新建一个tab,会调用onTabWidgetCurrentChanged函数! @@ -1149,7 +1143,7 @@ void HPPA::onTabWidgetCurrentChanged(int index)//代码新建一个tab,会调 //获取绘图控件 QWidget* currentWidget = m_imageViewerTabWidget->widget(index); - QList currentImageViewer = currentWidget->findChildren(); + QList currentImageViewer = currentWidget->findChildren(); //先disconnect然后再connect,否则每次切换一次都会connect一次,会累积connect很多次! disconnect(currentImageViewer[0], SIGNAL(leftMouseButtonPressed(int, int)), this, SLOT(onLeftMouseButtonPressed(int, int))); @@ -1425,38 +1419,16 @@ void HPPA::onOpenImg() QFileInfo fi(uri); QString baseName = fi.completeBaseName(); - // Create RasterLayer and wrap in LayerTreeLayerNode - RasterLayer* rl = new RasterLayer(baseName, uri); - auto* layerNode = new LayerTreeLayerNode(rl); - m_LayerTreeModel->addLayer(m_RasterGroup, layerNode); + RasterLayer* rl = new RasterLayer(baseName, uri); - // 3) 渲染一副图像并保存到 C:\2 - RasterLayer::RenderParams params; // use defaults - QImage img = rl->render(params); - if (img.isNull()) - { - QMessageBox::warning(this, tr("Render failed"), tr("Failed to render image from %1").arg(uri)); - return; - } + auto* layerNode = new LayerTreeLayerNode(rl); + m_LayerTreeModel->addLayer(m_RasterGroup, layerNode); - QDir outDir("C:/2"); - if (!outDir.exists()) - { - if (!outDir.mkpath(".")) - { - QMessageBox::warning(this, tr("Save failed"), tr("Failed to create output directory C:/2")); - return; - } - } - - QString outPath = outDir.filePath(baseName + "_render.png"); - if (!img.save(outPath)) - { - QMessageBox::warning(this, tr("Save failed"), tr("Failed to save rendered image to %1").arg(outPath)); - return; - } - - QMessageBox::information(this, tr("Saved"), tr("Rendered image saved to %1").arg(outPath)); + QWidget* mapcavasContainer = onCreateTab(baseName); + if (m_MapLayerStore) m_MapLayerStore->addLayer(rl, mapcavasContainer); + QList mapcavas = mapcavasContainer->findChildren(); + mapcavas[0]->setLayers(rl); + mapcavas[0]->freshmap(); } void HPPA::onconnect() @@ -1504,7 +1476,7 @@ void HPPA::onconnect() m_Imager->connect_imager(frame_number->text().toInt()); m_Imager->setFileName2Save(m_FilenameLineEdit->text().toStdString()); - connect(m_Imager, SIGNAL(PlotSignal(int, int)), this, SLOT(onPlotHyperspectralImageRgbImage(int, int))); + connect(m_Imager, SIGNAL(PlotSignal(int, int, QString)), this, SLOT(onPlotHyperspectralImageRgbImage(int, int, QString))); connect(m_Imager, SIGNAL(RecordFinishedSignal_WhenFrameNumberMeet()), this, SLOT(onRecordFinishedSignal_WhenFrameNumberMeet())); connect(m_Imager, SIGNAL(RecordFinishedSignal_WhenFrameNumberNotMeet()), this, SLOT(onRecordFinishedSignal_WhenFrameNumberNotMeet())); connect(m_Imager, SIGNAL(SpectralSignal(int)), this, SLOT(PlotSpectral(int))); @@ -1651,7 +1623,7 @@ void HPPA::onFocus2(int command) QWidget* tabTmp = new QWidget(); QGridLayout* GridLayout = new QGridLayout(); - GridLayout->addWidget(new mapcavas(tabTmp)); + GridLayout->addWidget(new Mapcavas(tabTmp)); tabTmp->setLayout(GridLayout); @@ -1737,7 +1709,7 @@ void HPPA::recordWhiteFinish() ui.mainToolBar->widgetForAction(ui.action_reference)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); } -void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber) +void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber, QString filePath) { //使用机械臂采集时,会在停止采集后的瞬间又开始采集,会导致上次采集最后发射的信号调用此槽函数报错 QAction* checked = moveplatformActionGroup->checkedAction(); @@ -1749,8 +1721,10 @@ void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber) //return; //获取绘图控件 - QWidget* currentWidget = m_imageViewerTabWidget->widget(fileNumber); - QList currentImageViewer = currentWidget->findChildren(); + QWidget* currentWidget = m_MapLayerStore->widgetForLayer(filePath); + //QWidget* currentWidget = m_imageViewerTabWidget->widget(fileNumber); + + QList currentImageViewer = currentWidget->findChildren(); currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFrameCounter());//界面中显示已经采集的帧数 //创建需要显示的图像--opencv版本 @@ -1785,7 +1759,7 @@ void HPPA::PlotSpectral(int state) { //显示影像 QWidget* currentWidget = m_imageViewerTabWidget->currentWidget(); - QList currentImageViewer = currentWidget->findChildren(); + QList currentImageViewer = currentWidget->findChildren(); currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFocusFrameCounter());//界面中显示已经采集的帧数 ImageProcessor imageProcessor; @@ -1921,10 +1895,15 @@ void HPPA::onLayerCreatedFromFile(const QString& baseName, const QString& filePa { if (!m_LayerTreeModel || !m_RasterGroup) return; - // Create MapLayer first and attach it to a LayerTreeLayerNode - MapLayer* ml = new RasterLayer(baseName, filePath); - auto* layerNode = new LayerTreeLayerNode(ml); + QWidget* mapcavasContainer = onCreateTab(baseName); + // Create MapLayer first and attach it to a LayerTreeLayerNode + RasterLayer* ml = new RasterLayer(baseName, filePath); + if (m_MapLayerStore) m_MapLayerStore->addLayer(ml, mapcavasContainer); + QList mapcavas = mapcavasContainer->findChildren(); + mapcavas[0]->setLayers(ml); + + auto* layerNode = new LayerTreeLayerNode(ml); LayerTreeNode* node = m_LayerTreeModel->addLayer(m_RasterGroup, layerNode); LayerTreeLayerNode* lnode = dynamic_cast(node); if (!lnode) return; diff --git a/HPPA/HPPA.h b/HPPA/HPPA.h index e4cac03..e3ece65 100644 --- a/HPPA/HPPA.h +++ b/HPPA/HPPA.h @@ -54,6 +54,7 @@ #include "LayerTreeModel.h" #include "LayerTree.h" #include "MapLayer.h" +#include "MapLayerStore.h" #define PI 3.1415926 @@ -259,8 +260,10 @@ private: LayerTreeModel* m_LayerTreeModel = nullptr; LayerTreeNode* m_RasterGroup = nullptr; // 指向 "Raster" 分组,便于后续添加 layer + MapLayerStore* m_MapLayerStore = nullptr; + public Q_SLOTS: - void onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber); + void onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber, QString filePath); void PlotSpectral(int state); void onRecordFinishedSignal_WhenFrameNumberMeet(); void onRecordFinishedSignal_WhenFrameNumberNotMeet(); @@ -279,7 +282,7 @@ public Q_SLOTS: void onReference(); void recordWhiteFinish(); void onStartRecordStep1(); - void onCreateTab(int trackNumber); + QWidget* onCreateTab(QString tabName); void onTabWidgetCurrentChanged(int index); void onActionOpenDirectory(); diff --git a/HPPA/HPPA.vcxproj b/HPPA/HPPA.vcxproj index 7206375..65c5a03 100644 --- a/HPPA/HPPA.vcxproj +++ b/HPPA/HPPA.vcxproj @@ -120,6 +120,7 @@ + @@ -196,6 +197,7 @@ + diff --git a/HPPA/HPPA.vcxproj.filters b/HPPA/HPPA.vcxproj.filters index 7a3619b..daca754 100644 --- a/HPPA/HPPA.vcxproj.filters +++ b/HPPA/HPPA.vcxproj.filters @@ -166,6 +166,9 @@ Source Files + + Source Files + @@ -261,6 +264,9 @@ Header Files + + Header Files + diff --git a/HPPA/ImageViewer.cpp b/HPPA/ImageViewer.cpp index 8dace79..5c3de17 100644 --- a/HPPA/ImageViewer.cpp +++ b/HPPA/ImageViewer.cpp @@ -12,7 +12,7 @@ #define VIEW_WIDTH viewport()->rect().width() #define VIEW_HEIGHT viewport()->rect().height() -mapcavas::mapcavas(QWidget* pParent) :QGraphicsView(pParent) +Mapcavas::Mapcavas(QWidget* pParent) :QGraphicsView(pParent) { setRenderHint(QPainter::Antialiasing); setRenderHint(QPainter::SmoothPixmapTransform); @@ -49,18 +49,18 @@ mapcavas::mapcavas(QWidget* pParent) :QGraphicsView(pParent) setFrameShape(QFrame::NoFrame); } -mapcavas::~mapcavas() +Mapcavas::~Mapcavas() { } -void mapcavas::DisplayFrameNumber(int frameNumber) +void Mapcavas::DisplayFrameNumber(int frameNumber) { m_framNumberLabel->setText(QString::number(frameNumber)); m_framNumberLabel->adjustSize(); } -void mapcavas::SetImage(QPixmap *image) +void Mapcavas::SetImage(QPixmap *image) { if (!HasImage()) { @@ -73,7 +73,7 @@ void mapcavas::SetImage(QPixmap *image) ensureSceneVisible(); } -void mapcavas::ensureSceneVisible() +void Mapcavas::ensureSceneVisible() { resetTransform(); @@ -90,7 +90,7 @@ void mapcavas::ensureSceneVisible() centerOn(scene_rect.center()); } -bool mapcavas::HasImage() +bool Mapcavas::HasImage() { if (m_GraphicsPixmapItemHandle == nullptr) { @@ -102,7 +102,7 @@ bool mapcavas::HasImage() } } -void mapcavas::wheelEvent(QWheelEvent *event) +void Mapcavas::wheelEvent(QWheelEvent *event) { if (HasImage()) { @@ -118,12 +118,12 @@ void mapcavas::wheelEvent(QWheelEvent *event) } } -void mapcavas::scaling(qreal scaleFactor) +void Mapcavas::scaling(qreal scaleFactor) { scale(scaleFactor, scaleFactor); } -void mapcavas::mousePressEvent(QMouseEvent *event) +void Mapcavas::mousePressEvent(QMouseEvent *event) { if (event->button()==Qt::LeftButton) { @@ -135,7 +135,7 @@ void mapcavas::mousePressEvent(QMouseEvent *event) QGraphicsView::mousePressEvent(event); } -void mapcavas::mouseMoveEvent(QMouseEvent *event) +void Mapcavas::mouseMoveEvent(QMouseEvent *event) { if (m_bMouseTranslate){ QPointF mouseDelta = mapToScene(event->pos()) - mapToScene(m_lastMousePos); @@ -146,28 +146,28 @@ void mapcavas::mouseMoveEvent(QMouseEvent *event) QGraphicsView::mousePressEvent(event); } -void mapcavas::mouseReleaseEvent(QMouseEvent *event) +void Mapcavas::mouseReleaseEvent(QMouseEvent *event) { m_bMouseTranslate = false; QGraphicsView::mouseReleaseEvent(event); } -void mapcavas::mouseDoubleClickEvent(QMouseEvent *event) +void Mapcavas::mouseDoubleClickEvent(QMouseEvent *event) { QGraphicsView::mouseDoubleClickEvent(event); } -void mapcavas::zoomIn() +void Mapcavas::zoomIn() { zoom(1 + m_zoomDelta); } -void mapcavas::zoomOut() +void Mapcavas::zoomOut() { zoom(1 - m_zoomDelta); } -void mapcavas::zoom(float scaleFactor) +void Mapcavas::zoom(float scaleFactor) { qreal factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width(); if (factor < 0.07 || factor > 100) @@ -177,38 +177,38 @@ void mapcavas::zoom(float scaleFactor) m_scale *= scaleFactor; } -void mapcavas::setTranslateSpeed(qreal speed) +void Mapcavas::setTranslateSpeed(qreal speed) { Q_ASSERT_X(speed >= 0.0 && speed <= 2.0, "InteractiveView::setTranslateSpeed", "Speed should be in range [0.0, 2.0]."); m_translateSpeed = speed; } -qreal mapcavas::translateSpeed() const +qreal Mapcavas::translateSpeed() const { return m_translateSpeed; } -void mapcavas::setZoomDelta(qreal delta) +void Mapcavas::setZoomDelta(qreal delta) { Q_ASSERT_X(delta >= 0.0 && delta <= 1.0, "InteractiveView::setZoomDelta", "Delta should be in range [0.0, 1.0]."); m_zoomDelta = delta; } -qreal mapcavas::zoomDelta() const +qreal Mapcavas::zoomDelta() const { return m_zoomDelta; } // new: set associated raster layer -void mapcavas::setLayers(RasterLayer* layer) +void Mapcavas::setLayers(RasterLayer* layer) { m_rasterLayer = layer; } // new: refresh the map by rendering using the RasterLayer's render method -void mapcavas::freshmap() +void Mapcavas::freshmap() { if (!m_rasterLayer) return; diff --git a/HPPA/ImageViewer.h b/HPPA/ImageViewer.h index 50cb4ef..04e160a 100644 --- a/HPPA/ImageViewer.h +++ b/HPPA/ImageViewer.h @@ -6,13 +6,13 @@ class RasterLayer; // forward -class mapcavas : public QGraphicsView +class Mapcavas : public QGraphicsView { Q_OBJECT public: - mapcavas(QWidget* pParent = NULL); - ~mapcavas(); + Mapcavas(QWidget* pParent = NULL); + ~Mapcavas(); void DisplayFrameNumber(int frameNumber); diff --git a/HPPA/ImagerOperationBase.cpp b/HPPA/ImagerOperationBase.cpp index 9738708..22c707f 100644 --- a/HPPA/ImagerOperationBase.cpp +++ b/HPPA/ImagerOperationBase.cpp @@ -234,13 +234,11 @@ void ImagerOperationBase::start_record() } // ڿʼɼʱļϢUI д MapLayer - { - // prepare file name that will be used for saving - m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil"; - QString baseName = QString::fromStdString(removeFileExtension(m_FileName2Save2)); - QString filePath = QString::fromStdString(m_FileName2Save2); - emit LayerFileCreated(baseName, filePath, m_FileSavedCounter); - } + // prepare file name that will be used for saving + m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil"; + QString baseName = QString::fromStdString(getFileNameFromPath(m_FileName2Save2)); + QString filePath = QString::fromStdString(m_FileName2Save2); + emit LayerFileCreated(baseName, filePath, m_FileSavedCounter); FILE* m_fImage = fopen(m_FileName2Save2.c_str(), "w+b"); @@ -307,7 +305,7 @@ void ImagerOperationBase::start_record() //ÿ1sһνͼλ if (m_iFrameCounter % (int)getFramerate() == 0) { - emit PlotSignal(m_FileSavedCounter, m_iFrameCounter); + emit PlotSignal(m_FileSavedCounter, m_iFrameCounter, filePath); } if (m_iFrameCounter >= m_iFrameNumber) @@ -320,7 +318,7 @@ void ImagerOperationBase::start_record() //һλͼǰҪһ //m_RgbImage - emit PlotSignal(m_FileSavedCounter, -1); + emit PlotSignal(m_FileSavedCounter, -1, filePath); m_bRecordControlState = false; WriteHdr(); diff --git a/HPPA/ImagerOperationBase.h b/HPPA/ImagerOperationBase.h index 5b04ece..bc1f88f 100644 --- a/HPPA/ImagerOperationBase.h +++ b/HPPA/ImagerOperationBase.h @@ -102,7 +102,7 @@ public slots: void getFocusIndexSobel(); signals: - void PlotSignal(int, int);//ӰźţһڼӰ񣻵ڶɼ֡-1˴βɼһλ + void PlotSignal(int, int, QString);//ӰźţһڼӰ񣻵ڶɼ֡-1˴βɼһλ void RecordFinishedSignal_WhenFrameNumberMeet();//ɼźţҪɼ֡m_iFrameNumberɼ void RecordFinishedSignal_WhenFrameNumberNotMeet();//ɼźţҪɼ֡m_iFrameNumberûвɼɣ;ֹͣɼ void SpectralSignal(int);//1ڵƹף0ʾɣ diff --git a/HPPA/MapLayer.h b/HPPA/MapLayer.h index 23ff393..c9579f0 100644 --- a/HPPA/MapLayer.h +++ b/HPPA/MapLayer.h @@ -26,3 +26,5 @@ private: QString m_name; QString m_uri; }; + +Q_DECLARE_METATYPE(MapLayer*) diff --git a/HPPA/MapLayerStore.cpp b/HPPA/MapLayerStore.cpp new file mode 100644 index 0000000..26f7437 --- /dev/null +++ b/HPPA/MapLayerStore.cpp @@ -0,0 +1,83 @@ +#include "MapLayerStore.h" +#include "MapLayer.h" + +MapLayerStore::MapLayerStore(QObject* parent) + : QObject(parent) +{ + int a = 1; +} + +void MapLayerStore::addLayer(MapLayer* layer, QWidget* widget) +{ + if (!layer) return; + MapLayer* raw = layer; + m_layers.emplace_back(std::shared_ptr(layer)); + if (widget) + m_layerWidgets[raw] = widget; + emit layerAdded(raw); +} + +void MapLayerStore::removeLayer(MapLayer* layer) +{ + if (!layer) return; + for (auto it = m_layers.begin(); it != m_layers.end(); ++it) { + if (it->get() == layer) { + emit layerAboutToBeRemoved(layer); + m_layers.erase(it); + m_layerWidgets.erase(layer); + return; + } + } +} + +void MapLayerStore::removeLayerByName(const QString& name) +{ + for (auto it = m_layers.begin(); it != m_layers.end(); ++it) { + if ((*it)->name() == name) { + MapLayer* raw = it->get(); + emit layerAboutToBeRemoved(raw); + m_layers.erase(it); + m_layerWidgets.erase(raw); + return; + } + } +} + +MapLayer* MapLayerStore::getLayer(const QString& name) const +{ + for (const auto& l : m_layers) { + if (l->name() == name) return l.get(); + } + return nullptr; +} + +MapLayer* MapLayerStore::getLayerAt(int index) const +{ + if (index < 0 || index >= (int)m_layers.size()) return nullptr; + return m_layers[index].get(); +} + +int MapLayerStore::layerCount() const +{ + return (int)m_layers.size(); +} + +QWidget* MapLayerStore::widgetForLayer(MapLayer* layer) const +{ + auto it = m_layerWidgets.find(layer); + if (it == m_layerWidgets.end()) return nullptr; + return it->second; +} + +QWidget* MapLayerStore::widgetForLayer(const QString& absolutePath) const +{ + for (const auto& sp : m_layers) { + if (sp && sp->dataPath() == absolutePath) { + MapLayer* raw = sp.get(); + auto it = m_layerWidgets.find(raw); + if (it != m_layerWidgets.end()) return it->second; + return nullptr; + } + } + return nullptr; +} diff --git a/HPPA/MapLayerStore.h b/HPPA/MapLayerStore.h new file mode 100644 index 0000000..76f5ee1 --- /dev/null +++ b/HPPA/MapLayerStore.h @@ -0,0 +1,48 @@ +#pragma once + +#include +#include +#include +#include +#include + +class MapLayer; +class QWidget; + +class MapLayerStore : public QObject +{ + Q_OBJECT +public: + explicit MapLayerStore(QObject* parent = nullptr); + ~MapLayerStore() override = default; + + // Take ownership of the layer (store will own and manage its lifetime) + // Now also accept the associated QWidget so UI widget can be retrieved by layer pointer + void addLayer(MapLayer* layer, QWidget* widget = nullptr); + + // Remove by pointer or by name. Destruction happens when removed from store. +public slots: + void removeLayer(MapLayer* layer); + void removeLayerByName(const QString& name); + + // Queries + MapLayer* getLayer(const QString& name) const; + MapLayer* getLayerAt(int index) const; + int layerCount() const; + + // Get associated widget for a layer (or nullptr if none) + QWidget* widgetForLayer(MapLayer* layer) const; + // Get associated widget by layer absolute data path + QWidget* widgetForLayer(const QString& absolutePath) const; + +signals: + void layerAdded(MapLayer* layer); + // Emitted just before the layer is destroyed/removed from store + void layerAboutToBeRemoved(MapLayer* layer); + +private: + // store shared ownership so other parts can keep raw pointers safely (or use QPointer) + std::vector> m_layers; + // mapping from raw MapLayer pointer to associated QWidget* + std::unordered_map m_layerWidgets; +}; diff --git a/HPPA/ResononNirImager.cpp b/HPPA/ResononNirImager.cpp index 3ec5c14..32332ea 100644 --- a/HPPA/ResononNirImager.cpp +++ b/HPPA/ResononNirImager.cpp @@ -286,6 +286,7 @@ void ResononNirImager::start_record() } m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil"; + QString filePath = QString::fromStdString(m_FileName2Save2); FILE* m_fImage = fopen(m_FileName2Save2.c_str(), "w+b"); size_t x; @@ -353,7 +354,7 @@ void ResononNirImager::start_record() //ÿ1sһνͼλ if (m_iFrameCounter % (int)getFramerate() == 0) { - emit PlotSignal(m_FileSavedCounter, m_iFrameCounter); + emit PlotSignal(m_FileSavedCounter, m_iFrameCounter, filePath); } if (m_iFrameCounter >= m_iFrameNumber) @@ -367,7 +368,7 @@ void ResononNirImager::start_record() //һλͼǰҪһ //m_RgbImage - emit PlotSignal(m_FileSavedCounter, -1);//ɼɺһλͼԷɼ֡֡ʵıʱͼȫ + emit PlotSignal(m_FileSavedCounter, -1, filePath);//ɼɺһλͼԷɼ֡֡ʵıʱͼȫ m_bRecordControlState = false; WriteHdr(); diff --git a/HPPA/utility_tc.cpp b/HPPA/utility_tc.cpp index 016cdf4..d6a3b6f 100644 --- a/HPPA/utility_tc.cpp +++ b/HPPA/utility_tc.cpp @@ -112,6 +112,24 @@ std::string removeFileExtension(std::string filename) } +// 从绝对路径中提取文件名(不包含扩展名) +std::string getFileNameFromPath(const std::string &fullPath) +{ + // 找到最后一个路径分隔符,支持 '/' 和 '\\' + size_t lastSlash = fullPath.find_last_of("/\\"); + size_t start = (lastSlash == std::string::npos) ? 0 : lastSlash + 1; + + // 找到最后一个点,确保点在文件名范围内 + size_t lastDot = fullPath.find_last_of('.'); + if (lastDot == std::string::npos || lastDot < start) { + // 没有扩展名或点在路径之前,直接返回从 start 到结尾的子串 + return fullPath.substr(start); + } + + // 返回从 start 到 lastDot 之间的文件名(不含扩展名) + return fullPath.substr(start, lastDot - start); +} + QList getFileInfo(QString file) { QFileInfo fileInfo = QFileInfo(file); diff --git a/HPPA/utility_tc.h b/HPPA/utility_tc.h index c7700df..1428550 100644 --- a/HPPA/utility_tc.h +++ b/HPPA/utility_tc.h @@ -20,6 +20,7 @@ void swap(unsigned short * a, unsigned short * b); bool createDir(QString fullPath); std::string removeFileExtension(std::string filename); +std::string getFileNameFromPath(const std::string& fullPath); QList getFileInfo(QString file);