From 5f965f0d8ef78a88d57d18bf6b5d0cff8a652d5c Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Thu, 28 May 2026 00:44:59 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E5=85=BC=E5=AE=B92=E7=A7=8D=E5=B8=A7?= =?UTF-8?q?=E6=95=B0=E6=98=BE=E7=A4=BA=E9=80=BB=E8=BE=91=EF=BC=9A=EF=BC=88?= =?UTF-8?q?1=EF=BC=89=E9=87=87=E9=9B=86=E6=97=B6=E7=9A=84=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E5=B8=A7=E6=95=B0=EF=BC=882=EF=BC=89=E6=89=93?= =?UTF-8?q?=E5=BC=80=E5=BD=B1=E5=83=8F=E6=97=B6=E7=9A=84=E5=B8=A7=E6=95=B0?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HPPA/HPPA.cpp | 51 +++++++++++++++++++++++-------------- HPPA/MapLayerStore.cpp | 9 +++++++ HPPA/MapLayerStore.h | 3 ++- HPPA/RasterLayer.cpp | 18 +++++++++++++ HPPA/RasterLayer.h | 4 +++ HPPA/recordFrameCounter.cpp | 17 +++++++------ HPPA/recordFrameCounter.h | 13 +++++----- 7 files changed, 81 insertions(+), 34 deletions(-) diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index edf3f3b..f93abcf 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -1064,16 +1064,20 @@ void HPPA::removeLayerByNode(LayerTreeNode* node) const int tabIndex = m_imageViewerTabWidget->indexOf(widget); if (tabIndex >= 0) { - if (m_recordFrameCounter) - { - m_recordFrameCounter->removeCounter(widget); - } m_imageViewerTabWidget->removeTab(tabIndex); } widget->deleteLater(); } } + if (!mapLayer || mapLayer->layerType() == MapLayer::LayerType::Raster) + { + if (m_recordFrameCounter) + { + m_recordFrameCounter->removeCounter(static_cast(mapLayer)); + } + } + // 删除 MapLayerStore 中的 mapLayer m_MapLayerStore->removeLayer(mapLayer); @@ -1131,10 +1135,6 @@ void HPPA::removeImageByTreeIndex() const int tabIndex = m_imageViewerTabWidget->indexOf(layerWidget); if (tabIndex >= 0) { - if (m_recordFrameCounter) - { - m_recordFrameCounter->removeCounter(layerWidget); - } m_imageViewerTabWidget->removeTab(tabIndex); } layerWidget->deleteLater(); @@ -1701,11 +1701,6 @@ QWidget* HPPA::onCreateTab(QString tabName) m_imageViewerTabWidget->setCurrentIndex(m_imageViewerTabWidget->count() - 1); - if (m_recordFrameCounter) - { - m_recordFrameCounter->addCounter(tabTmp); - } - return tabTmp; } @@ -1722,7 +1717,11 @@ void HPPA::onTabWidgetCurrentChanged(int index)//代码新建一个tab,会调 if (m_recordFrameCounter) { QWidget* currentWidget = m_imageViewerTabWidget->widget(index); - m_recordFrameCounter->switchTo(currentWidget); + MapLayer* currentMapLayer = m_MapLayerStore->mapLayerForWidget(currentWidget); + if (currentMapLayer) + { + m_recordFrameCounter->switchTo(static_cast(currentMapLayer)); + } } //获取绘图控件 @@ -2028,6 +2027,14 @@ void HPPA::onOpenImg() QString baseName = fi.completeBaseName(); addLayer(baseName, uri, true); + + // 获取影像行数并更新帧数显示 + MapLayer* mapLayer = m_MapLayerStore->getLayerByAbsolutePath(uri); + if (mapLayer && m_recordFrameCounter) + { + RasterLayer* rasterLayer = static_cast(mapLayer); + m_recordFrameCounter->updateFrameCount(rasterLayer, rasterLayer->height()); + } } void HPPA::disconnectImagerAndCleanup() @@ -2448,6 +2455,12 @@ void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber, QSt return; } + MapLayer* mapLayer = m_MapLayerStore->getLayerByAbsolutePath(filePath); + if (mapLayer && m_recordFrameCounter) + { + m_recordFrameCounter->updateFrameCount(static_cast(mapLayer), m_Imager->getFrameCounter()); + } + if (ui.mAction3DPlantPhenotypeScenario->isChecked()) return; @@ -2459,11 +2472,6 @@ void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber, QSt QList currentImageViewer = currentWidget->findChildren(); currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFrameCounter());//界面中显示已经采集的帧数 - if (m_recordFrameCounter) - { - m_recordFrameCounter->updateFrameCount(currentWidget, m_Imager->getFrameCounter()); - } - //创建需要显示的图像--opencv版本 ImageProcessor imageProcessor; //cv::Mat rgbImage(*m_Imager->getRgbImage()->m_matRgbImage, cv::Range(0, m_Imager->getFrameCounter()), cv::Range::all());//2022.3.18重构的 @@ -2665,6 +2673,11 @@ void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refres if (m_MapLayerStore) m_MapLayerStore->addLayer(ml); + if (m_recordFrameCounter) + { + m_recordFrameCounter->addCounter(ml); + } + if (isAddImage) { newImage(ml, RasterImageLayer::RendererType::Multiband, node, refresh); diff --git a/HPPA/MapLayerStore.cpp b/HPPA/MapLayerStore.cpp index 0234aa3..55d42e3 100644 --- a/HPPA/MapLayerStore.cpp +++ b/HPPA/MapLayerStore.cpp @@ -125,6 +125,15 @@ MapLayer* MapLayerStore::getLayerAt(int index) const return m_layers[index].mapLayer.get(); } +MapLayer* MapLayerStore::getLayerByAbsolutePath(const QString& absolutePath) const +{ + for (const auto& entry : m_layers) { + if (entry.mapLayer->dataPath() == absolutePath) + return entry.mapLayer.get(); + } + return nullptr; +} + int MapLayerStore::layerCount() const { return (int)m_layers.size(); diff --git a/HPPA/MapLayerStore.h b/HPPA/MapLayerStore.h index 4744664..a92310c 100644 --- a/HPPA/MapLayerStore.h +++ b/HPPA/MapLayerStore.h @@ -35,6 +35,7 @@ public: bool containsLayer(const QString& url, bool isAbsolutePath = true) const; MapLayer* getLayer(const QString& name) const; + MapLayer* getLayerByAbsolutePath(const QString& absolutePath) const; MapLayer* getLayerAt(int index) const; int layerCount() const; @@ -49,7 +50,7 @@ public: QWidget* widgetForImageLayer(RasterImageLayer* imageLayer) const; QWidget* widgetForLayer(MapLayer* layer) const; QWidget* widgetForLayer(const QString& absolutePath) const; - std::vector widgetsForMapLayer(MapLayer* mapLayer) const; + std::vector widgetsForMapLayer(MapLayer* mapLayer) const; // Reverse lookups MapLayer* mapLayerForImageLayer(RasterImageLayer* imageLayer) const; diff --git a/HPPA/RasterLayer.cpp b/HPPA/RasterLayer.cpp index 4514acc..107c8ed 100644 --- a/HPPA/RasterLayer.cpp +++ b/HPPA/RasterLayer.cpp @@ -78,3 +78,21 @@ std::vector RasterLayer::bandWavelengths() const } return m_provider->bandWavelengths(); } + +int RasterLayer::width() const +{ + if (!m_provider) { + auto* self = const_cast(this); + if (!self->openDataProvider()) return 0; + } + return m_provider->width(); +} + +int RasterLayer::height() const +{ + if (!m_provider) { + auto* self = const_cast(this); + if (!self->openDataProvider()) return 0; + } + return m_provider->height(); +} diff --git a/HPPA/RasterLayer.h b/HPPA/RasterLayer.h index 0cab6bb..d3bba45 100644 --- a/HPPA/RasterLayer.h +++ b/HPPA/RasterLayer.h @@ -31,6 +31,10 @@ public: // Get all band wavelengths std::vector bandWavelengths() const; + // Get dimensions + int width() const; + int height() const; + protected: std::unique_ptr m_provider; }; diff --git a/HPPA/recordFrameCounter.cpp b/HPPA/recordFrameCounter.cpp index 43bea9e..b73029d 100644 --- a/HPPA/recordFrameCounter.cpp +++ b/HPPA/recordFrameCounter.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "recordFrameCounter.h" +#include "RasterLayer.h" recordFrameCounter::recordFrameCounter(QWidget* parent) : QWidget(parent) @@ -16,19 +17,19 @@ recordFrameCounter::recordFrameCounter(QWidget* parent) layout->addWidget(m_stackedWidget); } -void recordFrameCounter::addCounter(QWidget* tabWidget) +void recordFrameCounter::addCounter(RasterLayer* mapLayer) { QLabel* label = new QLabel("0"); label->setStyleSheet("color: white;"); label->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); - m_labelMap.insert(tabWidget, label); + m_labelMap.insert(mapLayer, label); m_stackedWidget->addWidget(label); m_stackedWidget->setCurrentWidget(label); } -void recordFrameCounter::removeCounter(QWidget* tabWidget) +void recordFrameCounter::removeCounter(RasterLayer* mapLayer) { - auto it = m_labelMap.find(tabWidget); + auto it = m_labelMap.find(mapLayer); if (it != m_labelMap.end()) { QLabel* label = it.value(); @@ -38,18 +39,18 @@ void recordFrameCounter::removeCounter(QWidget* tabWidget) } } -void recordFrameCounter::switchTo(QWidget* tabWidget) +void recordFrameCounter::switchTo(RasterLayer* mapLayer) { - auto it = m_labelMap.find(tabWidget); + auto it = m_labelMap.find(mapLayer); if (it != m_labelMap.end()) { m_stackedWidget->setCurrentWidget(it.value()); } } -void recordFrameCounter::updateFrameCount(QWidget* tabWidget, int frameCount) +void recordFrameCounter::updateFrameCount(RasterLayer* mapLayer, int frameCount) { - auto it = m_labelMap.find(tabWidget); + auto it = m_labelMap.find(mapLayer); if (it != m_labelMap.end()) { it.value()->setText(QString::number(frameCount)); diff --git a/HPPA/recordFrameCounter.h b/HPPA/recordFrameCounter.h index dc6ee3d..7ab7257 100644 --- a/HPPA/recordFrameCounter.h +++ b/HPPA/recordFrameCounter.h @@ -6,19 +6,20 @@ #include #include +class RasterLayer; + class recordFrameCounter : public QWidget { Q_OBJECT public: explicit recordFrameCounter(QWidget* parent = nullptr); - void addCounter(QWidget* tabWidget); - void removeCounter(QWidget* tabWidget); - void switchTo(QWidget* tabWidget); - void updateFrameCount(QWidget* tabWidget, int frameCount); + void addCounter(RasterLayer* mapLayer); + void removeCounter(RasterLayer* mapLayer); + void switchTo(RasterLayer* mapLayer); + void updateFrameCount(RasterLayer* mapLayer, int frameCount); private: QStackedWidget* m_stackedWidget = nullptr; - QMap m_labelMap; + QMap m_labelMap; }; -