1、为图层添加渲染器和读取器,分离图层基础信息、渲染和读写;
2、LayerTreeLayerNode持有MapLayer图层引用,为右键菜单做准备; 3、改名:imageviewer → mapcavas,mapcavas持有MapLayer图层引用,为刷新图像做准备;
This commit is contained in:
@ -5,240 +5,217 @@
|
||||
#include <QPoint>
|
||||
|
||||
#include "ImageViewer.h"
|
||||
#include "RasterLayer.h"
|
||||
|
||||
|
||||
#define VIEW_CENTER viewport()->rect().center()
|
||||
#define VIEW_WIDTH viewport()->rect().width()
|
||||
#define VIEW_HEIGHT viewport()->rect().height()
|
||||
|
||||
|
||||
ImageViewer::ImageViewer(QWidget* pParent) :QGraphicsView(pParent)
|
||||
mapcavas::mapcavas(QWidget* pParent) :QGraphicsView(pParent)
|
||||
{
|
||||
setRenderHint(QPainter::Antialiasing);
|
||||
setRenderHint(QPainter::SmoothPixmapTransform);
|
||||
setDragMode(QGraphicsView::ScrollHandDrag);
|
||||
setRenderHint(QPainter::Antialiasing);
|
||||
setRenderHint(QPainter::SmoothPixmapTransform);
|
||||
setDragMode(QGraphicsView::ScrollHandDrag);
|
||||
|
||||
// <20>ؼ<EFBFBD><D8BC>㣺<EFBFBD><E3A3BA>ʹ<EFBFBD><EFBFBD> Qt Ĭ<>ϵ<EFBFBD> anchor<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
setTransformationAnchor(QGraphicsView::NoAnchor);
|
||||
setResizeAnchor(QGraphicsView::NoAnchor);
|
||||
// ʹ<EFBFBD><EFBFBD> Qt Ĭ<><C4AC> anchor <EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
setTransformationAnchor(QGraphicsView::NoAnchor);
|
||||
setResizeAnchor(QGraphicsView::NoAnchor);
|
||||
|
||||
m_qtGraphicsScene = new QGraphicsScene(this);
|
||||
this->setScene(m_qtGraphicsScene);
|
||||
m_qtGraphicsScene->setSceneRect(-1e6, -1e6, 2e6, 2e6);
|
||||
m_qtGraphicsScene = new QGraphicsScene(this);
|
||||
this->setScene(m_qtGraphicsScene);
|
||||
m_qtGraphicsScene->setSceneRect(-1e6, -1e6, 2e6, 2e6);
|
||||
|
||||
m_framNumberLabel = new QLabel(this);
|
||||
m_framNumberLabel->setAlignment(Qt::AlignHCenter);
|
||||
m_framNumberLabel->setAlignment(Qt::AlignVCenter);
|
||||
m_framNumberLabel = new QLabel(this);
|
||||
m_framNumberLabel->setAlignment(Qt::AlignHCenter);
|
||||
m_framNumberLabel->setAlignment(Qt::AlignVCenter);
|
||||
|
||||
QFont ft;
|
||||
ft.setPointSize(14);
|
||||
m_framNumberLabel->setFont(ft);
|
||||
QFont ft;
|
||||
ft.setPointSize(14);
|
||||
m_framNumberLabel->setFont(ft);
|
||||
m_framNumberLabel->setText("0");
|
||||
|
||||
|
||||
m_GraphicsPixmapItemHandle = nullptr;
|
||||
m_GraphicsPixmapItemHandle = nullptr;
|
||||
|
||||
m_scale = 1.0;
|
||||
m_zoomDelta = 0.1;
|
||||
m_translateSpeed = 1.0;
|
||||
m_bMouseTranslate = false;
|
||||
m_scale = 1.0;
|
||||
m_zoomDelta = 0.1;
|
||||
m_translateSpeed = 1.0;
|
||||
m_bMouseTranslate = false;
|
||||
|
||||
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setFrameShape(QFrame::NoFrame);
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setFrameShape(QFrame::NoFrame);
|
||||
}
|
||||
|
||||
ImageViewer::~ImageViewer()
|
||||
mapcavas::~mapcavas()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ImageViewer::DisplayFrameNumber(int frameNumber)
|
||||
void mapcavas::DisplayFrameNumber(int frameNumber)
|
||||
{
|
||||
m_framNumberLabel->setText(QString::number(frameNumber));
|
||||
m_framNumberLabel->adjustSize();
|
||||
m_framNumberLabel->setText(QString::number(frameNumber));
|
||||
m_framNumberLabel->adjustSize();
|
||||
}
|
||||
|
||||
void ImageViewer::SetImage(QPixmap *image)
|
||||
void mapcavas::SetImage(QPixmap *image)
|
||||
{
|
||||
if (!HasImage())
|
||||
{
|
||||
m_GraphicsPixmapItemHandle = m_qtGraphicsScene->addPixmap(*image);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_GraphicsPixmapItemHandle->setPixmap(*image);
|
||||
}
|
||||
ensureSceneVisible();
|
||||
if (!HasImage())
|
||||
{
|
||||
m_GraphicsPixmapItemHandle = m_qtGraphicsScene->addPixmap(*image);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_GraphicsPixmapItemHandle->setPixmap(*image);
|
||||
}
|
||||
ensureSceneVisible();
|
||||
}
|
||||
|
||||
void ImageViewer::ensureSceneVisible()
|
||||
void mapcavas::ensureSceneVisible()
|
||||
{
|
||||
resetTransform();
|
||||
resetTransform();
|
||||
|
||||
auto view_rect = viewport()->rect();
|
||||
auto scene_rect = this->scene()->itemsBoundingRect();
|
||||
auto view_rect = viewport()->rect();
|
||||
auto scene_rect = this->scene()->itemsBoundingRect();
|
||||
|
||||
double x_ratio = view_rect.width() / scene_rect.width();
|
||||
double y_ratio = view_rect.height() / scene_rect.height();
|
||||
double scale_factor = std::min(x_ratio, y_ratio) * 0.9;
|
||||
double x_ratio = view_rect.width() / scene_rect.width();
|
||||
double y_ratio = view_rect.height() / scene_rect.height();
|
||||
double scale_factor = std::min(x_ratio, y_ratio) * 0.9;
|
||||
|
||||
scale(scale_factor, scale_factor);
|
||||
m_scale *= scale_factor;
|
||||
scale(scale_factor, scale_factor);
|
||||
m_scale *= scale_factor;
|
||||
|
||||
centerOn(scene_rect.center());
|
||||
centerOn(scene_rect.center());
|
||||
}
|
||||
|
||||
bool ImageViewer::HasImage()
|
||||
bool mapcavas::HasImage()
|
||||
{
|
||||
if (m_GraphicsPixmapItemHandle == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (m_GraphicsPixmapItemHandle == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
void ImageViewer::wheelEvent(QWheelEvent *event)
|
||||
void mapcavas::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
//qDebug() << "---------------+++++++++++++++++++++++++++++++++++++++++++++++++++ ";
|
||||
//if (true)//HasImage()
|
||||
//{
|
||||
// //Χ<><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>https://blog.csdn.net/GoForwardToStep/article/details/77035287?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param
|
||||
// // <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>view<65><77>λ<EFBFBD><CEBB>;
|
||||
// QPointF cursorPoint = event->pos();
|
||||
// // <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>scene<6E><65>λ<EFBFBD><CEBB>;
|
||||
// QPointF scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y()));
|
||||
if (HasImage())
|
||||
{
|
||||
QPointF oldPos = mapToScene(event->pos());
|
||||
|
||||
// // <20><>ȡview<65>Ŀ<EFBFBD><C4BF><EFBFBD>;
|
||||
// qreal viewWidth = this->viewport()->width();
|
||||
// qreal viewHeight = this->viewport()->height();
|
||||
QPoint scrollAmount = event->angleDelta();
|
||||
scrollAmount.y() > 0 ? zoomIn() : zoomOut();
|
||||
|
||||
// // <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>൱<EFBFBD><E0B5B1>view<65><77>С<EFBFBD>ĺ<EFBFBD><C4BA>ݱ<EFBFBD><DDB1><EFBFBD>;
|
||||
// qreal hScale = cursorPoint.x() / viewWidth;
|
||||
// qreal vScale = cursorPoint.y() / viewHeight;
|
||||
QPointF newPos = mapToScene(event->pos());
|
||||
|
||||
|
||||
// // <20><><EFBFBD>ֵĹ<D6B5><C4B9><EFBFBD><EFBFBD><EFBFBD>
|
||||
// QPoint scrollAmount = event->angleDelta();
|
||||
// // <20><>ֵ<EFBFBD><D6B5>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6>ʹ<EFBFBD><CAB9><EFBFBD>߷Ŵ<DFB7><C5B4><EFBFBD>ֵ<EFBFBD><D6B5>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
||||
// scrollAmount.y() > 0 ? zoomIn() : zoomOut();
|
||||
|
||||
|
||||
// // <20><>scene<6E><65><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
// QPointF viewPoint = this->matrix().map(scenePos);
|
||||
// // ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>view<65>Ŵ<EFBFBD><C5B4><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>չʾscene<6E><65>λ<EFBFBD><CEBB>;
|
||||
// horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale));
|
||||
// verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale));
|
||||
//}
|
||||
|
||||
if (HasImage())
|
||||
{
|
||||
QPointF oldPos = mapToScene(event->pos());
|
||||
|
||||
QPoint scrollAmount = event->angleDelta();
|
||||
scrollAmount.y() > 0 ? zoomIn() : zoomOut();
|
||||
|
||||
QPointF newPos = mapToScene(event->pos());
|
||||
|
||||
QPointF delta = newPos - oldPos;
|
||||
translate(delta.x(), delta.y());
|
||||
}
|
||||
|
||||
//QGraphicsView::wheelEvent(event);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
QPointF delta = newPos - oldPos;
|
||||
translate(delta.x(), delta.y());
|
||||
}
|
||||
}
|
||||
|
||||
void ImageViewer::scaling(qreal scaleFactor)
|
||||
void mapcavas::scaling(qreal scaleFactor)
|
||||
{
|
||||
//qDebug() << this->sceneRect();
|
||||
scale(scaleFactor, scaleFactor);
|
||||
scale(scaleFactor, scaleFactor);
|
||||
}
|
||||
|
||||
void ImageViewer::mousePressEvent(QMouseEvent *event)
|
||||
void mapcavas::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->button()==Qt::LeftButton)
|
||||
{
|
||||
m_bMouseTranslate = true;
|
||||
m_lastMousePos = event->pos();
|
||||
if (event->button()==Qt::LeftButton)
|
||||
{
|
||||
m_bMouseTranslate = true;
|
||||
m_lastMousePos = event->pos();
|
||||
|
||||
//qDebug() << mapToScene(m_lastMousePos);
|
||||
|
||||
emit leftMouseButtonPressed(mapToScene(m_lastMousePos).x(), mapToScene(m_lastMousePos).y());
|
||||
}
|
||||
|
||||
|
||||
//If you do not perform all the necessary work in your implementation of the virtual function, you may need to call the base class's implementation.
|
||||
QGraphicsView::mousePressEvent(event);
|
||||
emit leftMouseButtonPressed(mapToScene(m_lastMousePos).x(), mapToScene(m_lastMousePos).y());
|
||||
}
|
||||
QGraphicsView::mousePressEvent(event);
|
||||
}
|
||||
|
||||
void ImageViewer::mouseMoveEvent(QMouseEvent *event)
|
||||
void mapcavas::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (m_bMouseTranslate){
|
||||
QPointF mouseDelta = mapToScene(event->pos()) - mapToScene(m_lastMousePos);
|
||||
translate(mouseDelta.x(),mouseDelta.y());
|
||||
}
|
||||
if (m_bMouseTranslate){
|
||||
QPointF mouseDelta = mapToScene(event->pos()) - mapToScene(m_lastMousePos);
|
||||
translate(mouseDelta.x(),mouseDelta.y());
|
||||
}
|
||||
|
||||
m_lastMousePos = event->pos();
|
||||
QGraphicsView::mousePressEvent(event);
|
||||
m_lastMousePos = event->pos();
|
||||
QGraphicsView::mousePressEvent(event);
|
||||
}
|
||||
|
||||
void ImageViewer::mouseReleaseEvent(QMouseEvent *event)
|
||||
void mapcavas::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
m_bMouseTranslate = false;
|
||||
QGraphicsView::mouseReleaseEvent(event);
|
||||
m_bMouseTranslate = false;
|
||||
QGraphicsView::mouseReleaseEvent(event);
|
||||
}
|
||||
|
||||
void ImageViewer::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
void mapcavas::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
{
|
||||
QGraphicsView::mouseDoubleClickEvent(event);
|
||||
QGraphicsView::mouseDoubleClickEvent(event);
|
||||
}
|
||||
|
||||
void ImageViewer::zoomIn()
|
||||
void mapcavas::zoomIn()
|
||||
{
|
||||
zoom(1 + m_zoomDelta);
|
||||
zoom(1 + m_zoomDelta);
|
||||
}
|
||||
|
||||
void ImageViewer::zoomOut()
|
||||
void mapcavas::zoomOut()
|
||||
{
|
||||
zoom(1 - m_zoomDelta);
|
||||
zoom(1 - m_zoomDelta);
|
||||
}
|
||||
|
||||
void ImageViewer::zoom(float scaleFactor)
|
||||
void mapcavas::zoom(float scaleFactor)
|
||||
{
|
||||
// <20><>ֹ<EFBFBD><D6B9>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
qreal factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width();
|
||||
if (factor < 0.07 || factor > 100)
|
||||
return;
|
||||
qreal factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width();
|
||||
if (factor < 0.07 || factor > 100)
|
||||
return;
|
||||
|
||||
scale(scaleFactor, scaleFactor);
|
||||
m_scale *= scaleFactor;
|
||||
scale(scaleFactor, scaleFactor);
|
||||
m_scale *= scaleFactor;
|
||||
}
|
||||
|
||||
void ImageViewer::setTranslateSpeed(qreal speed)
|
||||
void mapcavas::setTranslateSpeed(qreal speed)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ٶȷ<D9B6>Χ
|
||||
Q_ASSERT_X(speed >= 0.0 && speed <= 2.0,
|
||||
"InteractiveView::setTranslateSpeed", "Speed should be in range [0.0, 2.0].");
|
||||
m_translateSpeed = 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 ImageViewer::translateSpeed() const
|
||||
qreal mapcavas::translateSpeed() const
|
||||
{
|
||||
return m_translateSpeed;
|
||||
return m_translateSpeed;
|
||||
}
|
||||
|
||||
void ImageViewer::setZoomDelta(qreal delta)
|
||||
void mapcavas::setZoomDelta(qreal delta)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ
|
||||
Q_ASSERT_X(delta >= 0.0 && delta <= 1.0,
|
||||
"InteractiveView::setZoomDelta", "Delta should be in range [0.0, 1.0].");
|
||||
m_zoomDelta = 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 ImageViewer::zoomDelta() const
|
||||
qreal mapcavas::zoomDelta() const
|
||||
{
|
||||
return m_zoomDelta;
|
||||
return m_zoomDelta;
|
||||
}
|
||||
|
||||
// new: set associated raster layer
|
||||
void mapcavas::setLayers(RasterLayer* layer)
|
||||
{
|
||||
m_rasterLayer = layer;
|
||||
}
|
||||
|
||||
// new: refresh the map by rendering using the RasterLayer's render method
|
||||
void mapcavas::freshmap()
|
||||
{
|
||||
if (!m_rasterLayer) return;
|
||||
|
||||
RasterLayer::RenderParams params; // default params; could be extended
|
||||
QImage img = m_rasterLayer->render(params);
|
||||
if (img.isNull()) return;
|
||||
|
||||
QPixmap pm = QPixmap::fromImage(img);
|
||||
SetImage(&pm);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user