From 43acd5ba0159aa9f1314d6d884159d6aee2e8555 Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Wed, 27 May 2026 17:40:41 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=201=E3=80=81=E9=87=87=E9=9B=86?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=88=9B=E5=BB=BARasterImageLayer=E6=97=B6?= =?UTF-8?q?=EF=BC=8Cdataprovider=E5=BB=B6=E8=BF=9F=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=EF=BC=9B=202=E3=80=81=E9=87=87=E9=9B=86=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E9=80=9A=E8=BF=87=E6=B8=B2=E6=9F=93=E5=99=A8?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HPPA/HPPA.cpp | 2 +- HPPA/RasterImageLayer.cpp | 49 +++++++++++++++++++++++++-------------- HPPA/RasterImageLayer.h | 2 ++ 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index 3b451c1..50c16f1 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -2667,7 +2667,7 @@ void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refres if (isAddImage) { - newImage(ml, RasterImageLayer::RendererType::Multiband, node); + newImage(ml, RasterImageLayer::RendererType::Multiband, node, refresh); } } diff --git a/HPPA/RasterImageLayer.cpp b/HPPA/RasterImageLayer.cpp index efe3ca0..2fd41f5 100644 --- a/HPPA/RasterImageLayer.cpp +++ b/HPPA/RasterImageLayer.cpp @@ -8,32 +8,46 @@ RasterImageLayer::RasterImageLayer(RasterLayer* layer, RendererType type) : m_layer(layer) , m_rendererType(type) + , m_rendererInitialized(false) { +} + +void RasterImageLayer::ensureRenderer() +{ + if (m_rendererInitialized) return; if (!m_layer) return; RasterDataProvider* provider = nullptr; - if (m_layer->dataProvider()) { + if (m_layer->dataProvider()) + { provider = m_layer->dataProvider(); - } else if (m_layer->openDataProvider()) { + } + else if (m_layer->openDataProvider()) + { provider = m_layer->dataProvider(); } if (!provider) return; - switch (type) { - case RendererType::Multiband: { - auto* multiRenderer = new MultibandRasterRenderer(provider); - m_renderer.reset(multiRenderer); - multiRenderer->setParams(m_multibandParams); - break; - } - case RendererType::Singleband: { - auto* singleRenderer = new SinglebandRasterRenderer(provider); - m_renderer.reset(singleRenderer); - singleRenderer->setParams(m_singlebandParams); - break; - } + switch (m_rendererType) + { + case RendererType::Multiband: + { + auto* multiRenderer = new MultibandRasterRenderer(provider); + m_renderer.reset(multiRenderer); + multiRenderer->setParams(m_multibandParams); + break; + } + case RendererType::Singleband: + { + auto* singleRenderer = new SinglebandRasterRenderer(provider); + m_renderer.reset(singleRenderer); + singleRenderer->setParams(m_singlebandParams); + break; + } } + + m_rendererInitialized = true; } RasterImageLayer::~RasterImageLayer() @@ -43,6 +57,7 @@ RasterImageLayer::~RasterImageLayer() QImage RasterImageLayer::render() { + ensureRenderer(); if (!m_renderer) return QImage(); return m_renderer->render(); } @@ -50,7 +65,7 @@ QImage RasterImageLayer::render() void RasterImageLayer::setMultibandParams(const MultibandRenderParams& params) { m_multibandParams = params; - if (m_rendererType == RendererType::Multiband) { + if (m_rendererInitialized && m_rendererType == RendererType::Multiband) { auto* r = static_cast(m_renderer.get()); r->setParams(params); } @@ -59,7 +74,7 @@ void RasterImageLayer::setMultibandParams(const MultibandRenderParams& params) void RasterImageLayer::setSinglebandParams(const SinglebandRenderParams& params) { m_singlebandParams = params; - if (m_rendererType == RendererType::Singleband) { + if (m_rendererInitialized && m_rendererType == RendererType::Singleband) { auto* r = static_cast(m_renderer.get()); r->setParams(params); } diff --git a/HPPA/RasterImageLayer.h b/HPPA/RasterImageLayer.h index 66c4ab7..b791e46 100644 --- a/HPPA/RasterImageLayer.h +++ b/HPPA/RasterImageLayer.h @@ -22,6 +22,7 @@ public: RasterImageLayer(RasterLayer* layer, RendererType type); ~RasterImageLayer(); + void ensureRenderer(); QImage render(); RasterLayer* layer() const { return m_layer; } @@ -41,4 +42,5 @@ private: std::unique_ptr m_renderer; MultibandRenderParams m_multibandParams; SinglebandRenderParams m_singlebandParams; + bool m_rendererInitialized = false; };