修复点击显示光谱功能的问题:打开一副影像后,点击显示光谱出现十字架,然后移除图层后,再打开图层就会出现问题

This commit is contained in:
tangchao0503
2026-03-16 14:07:58 +08:00
parent 6d8c2f0419
commit 7473a45f41
7 changed files with 70 additions and 82 deletions

View File

@ -1570,16 +1570,7 @@ void HPPA::onOpenImg()
QFileInfo fi(uri);
QString baseName = fi.completeBaseName();
RasterLayer* rl = new RasterLayer(baseName, uri);
auto* layerNode = new LayerTreeLayer(rl);
m_LayerTreeModel->addLayer(m_RasterGroup, layerNode);
QWidget* mapcavasContainer = onCreateTab(baseName);
if (m_MapLayerStore) m_MapLayerStore->addLayer(rl, mapcavasContainer);
QList<Mapcavas*> mapcavas = mapcavasContainer->findChildren<Mapcavas*>();
mapcavas[0]->setLayers(rl);
mapcavas[0]->freshmap();
addLayer(baseName, uri, true);
}
void HPPA::onconnect()
@ -2025,23 +2016,26 @@ void WorkerThread3::run()
void HPPA::onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex)
{
if (!m_LayerTreeModel || !m_RasterGroup) return;
addLayer(baseName, filePath, false);
}
void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refresh)
{
// Create MapLayer first and attach it to a LayerTreeLayerNode
RasterLayer* ml = new RasterLayer(baseName, filePath);
auto* layerNode = new LayerTreeLayer(ml);
LayerTreeNode* node = m_LayerTreeModel->addLayer(m_RasterGroup, layerNode);
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*> mapcavas = mapcavasContainer->findChildren<Mapcavas*>();
mapcavas[0]->setLayers(ml);
auto* layerNode = new LayerTreeLayer(ml);
LayerTreeNode* node = m_LayerTreeModel->addLayer(m_RasterGroup, layerNode);
LayerTreeLayer* lnode = dynamic_cast<LayerTreeLayer*>(node);
if (!lnode) return;
// layerNode already holds the MapLayer pointer from constructor
qDebug() << "LayerFileCreated -> created layer:" << baseName << "path:" << filePath << "index:" << fileIndex;
if (refresh)
{
mapcavas[0]->freshmap();
}
}
void HPPA::onLayerTreeSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected)

View File

@ -341,6 +341,7 @@ public Q_SLOTS:
void onCreated3DModelPlantPhenotype();
void onCreated3DModelOneMotor();
void addLayer(const QString& baseName, const QString& filePath, bool refresh);
void onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex);
void removeLayerByTreeIndex();
void removeAllLayersInRasterGroup();

View File

@ -103,6 +103,50 @@ bool Mapcavas::HasImage()
}
}
void Mapcavas::updateCrosshair(double sceneX, double sceneY)
{
QPen pen(Qt::red, 2.0);
pen.setCosmetic(true); // constant screen-width regardless of zoom
if (!m_hLine)
{
m_hLine = m_qtGraphicsScene->addLine(0, 0, 0, 0, pen);
m_hLine->setZValue(1e9);
}
if (!m_vLine)
{
m_vLine = m_qtGraphicsScene->addLine(0, 0, 0, 0, pen);
m_vLine->setZValue(1e9);
}
m_hLine->setPen(pen);
m_vLine->setPen(pen);
m_hLine->setLine(sceneX - m_CrosshairHalfLen, sceneY,
sceneX + m_CrosshairHalfLen, sceneY);
m_vLine->setLine(sceneX, sceneY - m_CrosshairHalfLen,
sceneX, sceneY + m_CrosshairHalfLen);
}
void Mapcavas::removeCrosshair()
{
if (m_hLine)
{
if (m_hLine->scene())
m_hLine->scene()->removeItem(m_hLine);
delete m_hLine;
m_hLine = nullptr;
}
if (m_vLine)
{
if (m_vLine->scene())
m_vLine->scene()->removeItem(m_vLine);
delete m_vLine;
m_vLine = nullptr;
}
}
void Mapcavas::wheelEvent(QWheelEvent *event)
{
// Always let the tool have a chance first

View File

@ -29,6 +29,9 @@ public:
bool HasImage();
void ensureSceneVisible();
void updateCrosshair(double sceneX, double sceneY);
void removeCrosshair();
void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
void scaling(qreal scaleFactor);
@ -71,6 +74,10 @@ private:
QPoint m_lastMousePos; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>λ<EFBFBD><CEBB>
qreal m_scale; // <20><><EFBFBD><EFBFBD>ֵ
double m_CrosshairHalfLen = 10.0;
QGraphicsLineItem* m_hLine = nullptr; // horizontal line
QGraphicsLineItem* m_vLine = nullptr; // vertical line
signals:
void leftMouseButtonPressed(int, int, QVector<double>, QVector<double>);

View File

@ -34,7 +34,7 @@ void MapTool::setMapcavas(Mapcavas* canvas)
if (m_isActive && m_canvas)
{
deactivate();
//deactivate();
}
m_canvas = canvas;

View File

@ -8,8 +8,6 @@
#include <QPen>
#include <cmath>
const double MapToolSpectral::CrosshairHalfLen = 10.0;
MapToolSpectral::MapToolSpectral(QObject* parent)
: MapTool(parent)
{
@ -18,7 +16,6 @@ MapToolSpectral::MapToolSpectral(QObject* parent)
MapToolSpectral::~MapToolSpectral()
{
//removeCrosshair();//不需要在析构函数中调用removeCrosshair()因为当MapToolSpectral被销毁时它的canvas()也会被销毁crosshair的scene也会被销毁所以crosshair会自动被删除不会造成内存泄漏。
}
void MapToolSpectral::activate()
@ -28,7 +25,7 @@ void MapToolSpectral::activate()
void MapToolSpectral::deactivate()
{
removeCrosshair();
canvas()->removeCrosshair();
MapTool::deactivate();
}
@ -48,7 +45,7 @@ void MapToolSpectral::canvasMousePressEvent(QMouseEvent* e)
if (rl && rl->isValidPixel(x, y))
{
// Place crosshair at pixel center
updateCrosshair(x + 0.5, y + 0.5);
canvas()->updateCrosshair(x + 0.5, y + 0.5);
QVector<double> wavelengths;
QVector<double> spectrum;
@ -58,51 +55,3 @@ void MapToolSpectral::canvasMousePressEvent(QMouseEvent* e)
}
}
}
void MapToolSpectral::updateCrosshair(double sceneX, double sceneY)
{
if (!canvas() || !canvas()->scene())
return;
QGraphicsScene* scene = canvas()->scene();
QPen pen(Qt::red, 2.0);
pen.setCosmetic(true); // constant screen-width regardless of zoom
if (!m_hLine)
{
m_hLine = scene->addLine(0, 0, 0, 0, pen);
m_hLine->setZValue(1e9);
}
if (!m_vLine)
{
m_vLine = scene->addLine(0, 0, 0, 0, pen);
m_vLine->setZValue(1e9);
}
m_hLine->setPen(pen);
m_vLine->setPen(pen);
m_hLine->setLine(sceneX - CrosshairHalfLen, sceneY,
sceneX + CrosshairHalfLen, sceneY);
m_vLine->setLine(sceneX, sceneY - CrosshairHalfLen,
sceneX, sceneY + CrosshairHalfLen);
}
void MapToolSpectral::removeCrosshair()
{
if (m_hLine)
{
if (m_hLine->scene())
m_hLine->scene()->removeItem(m_hLine);
delete m_hLine;
m_hLine = nullptr;
}
if (m_vLine)
{
if (m_vLine->scene())
m_vLine->scene()->removeItem(m_vLine);
delete m_vLine;
m_vLine = nullptr;
}
}

View File

@ -23,13 +23,6 @@ signals:
void spectralClicked(int x, int y, QVector<double> wavelengths, QVector<double> spectrum);
private:
void updateCrosshair(double sceneX, double sceneY);
void removeCrosshair();
QGraphicsLineItem* m_hLine = nullptr; // horizontal line
QGraphicsLineItem* m_vLine = nullptr; // vertical line
static const double CrosshairHalfLen;
};
#endif // MAPTOOLSPECTRAL_H