1、优化QGraphicsView交互逻辑;

2、hdr文件添加byte order = 0;
This commit is contained in:
tangchao0503
2025-09-18 16:14:20 +08:00
parent 1e0cf1aa12
commit af88a6a67e
4 changed files with 66 additions and 48 deletions

View File

@ -14,8 +14,17 @@
ImageViewer::ImageViewer(QWidget* pParent) :QGraphicsView(pParent)
{
setRenderHint(QPainter::Antialiasing);
setRenderHint(QPainter::SmoothPixmapTransform);
setDragMode(QGraphicsView::ScrollHandDrag);
// <20>ؼ<EFBFBD><D8BC><EFBFBD><E3A3BA>ʹ<EFBFBD><CAB9> Qt Ĭ<>ϵ<EFBFBD> anchor<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><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_framNumberLabel = new QLabel(this);
m_framNumberLabel->setAlignment(Qt::AlignHCenter);
@ -61,9 +70,24 @@ void ImageViewer::SetImage(QPixmap *image)
{
m_GraphicsPixmapItemHandle->setPixmap(*image);
}
ensureSceneVisible();
}
setSceneRect(QRectF(image->rect()));
void ImageViewer::ensureSceneVisible()
{
resetTransform();
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;
scale(scale_factor, scale_factor);
m_scale *= scale_factor;
centerOn(scene_rect.center());
}
bool ImageViewer::HasImage()
@ -81,37 +105,50 @@ bool ImageViewer::HasImage()
void ImageViewer::wheelEvent(QWheelEvent *event)
{
//qDebug() << "---------------+++++++++++++++++++++++++++++++++++++++++++++++++++ ";
if (true)//HasImage()
//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()));
// // <20><>ȡview<65>Ŀ<EFBFBD><C4BF><EFBFBD>;
// qreal viewWidth = this->viewport()->width();
// qreal viewHeight = this->viewport()->height();
// // <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;
// // <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())
{
//Χ<><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()));
QPointF oldPos = mapToScene(event->pos());
// <20><>ȡview<65>Ŀ<EFBFBD><C4BF><EFBFBD>;
qreal viewWidth = this->viewport()->width();
qreal viewHeight = this->viewport()->height();
// <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;
// <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();
QPointF newPos = mapToScene(event->pos());
// <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));
QPointF delta = newPos - oldPos;
translate(delta.x(), delta.y());
}
QGraphicsView::wheelEvent(event);
//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>
}
void ImageViewer::scaling(qreal scaleFactor)
@ -141,7 +178,7 @@ void ImageViewer::mouseMoveEvent(QMouseEvent *event)
{
if (m_bMouseTranslate){
QPointF mouseDelta = mapToScene(event->pos()) - mapToScene(m_lastMousePos);
translate(mouseDelta);
translate(mouseDelta.x(),mouseDelta.y());
}
m_lastMousePos = event->pos();
@ -180,27 +217,6 @@ void ImageViewer::zoom(float scaleFactor)
m_scale *= scaleFactor;
}
void ImageViewer::translate(QPointF delta)
{
// <20><><EFBFBD>ݵ<EFBFBD>ǰ zoom <20><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
delta *= m_scale;
delta *= m_translateSpeed;
////<2F><><EFBFBD><EFBFBD>1<EFBFBD><31>
//scene()->setSceneRect(scene()->sceneRect().x() - delta.x(), scene()->sceneRect().y() - delta.y(),
// scene()->sceneRect().width(), scene()->sceneRect().height());
//scene()->update();
//<2F><><EFBFBD><EFBFBD>2<EFBFBD><32>
// view <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µĵ<C2B5><C4B5><EFBFBD>Ϊê<CEAA><C3AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ scene
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
QPoint newCenter(VIEW_WIDTH / 2 - delta.x(), VIEW_HEIGHT / 2 - delta.y());
centerOn(mapToScene(newCenter));
// scene <20><> view <20><><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>Ϊê<CEAA><C3AA>
setTransformationAnchor(QGraphicsView::AnchorViewCenter);
}
void ImageViewer::setTranslateSpeed(qreal speed)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ٶȷ<D9B6>Χ

View File

@ -22,6 +22,7 @@ public:
void SetImage(QPixmap *image);
bool HasImage();
void ensureSceneVisible();
void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
void scaling(qreal scaleFactor);
@ -29,7 +30,6 @@ public:
void zoomIn(); // <20>Ŵ<EFBFBD>
void zoomOut(); // <20><>С
void zoom(float scaleFactor); // <20><><EFBFBD><EFBFBD> - scaleFactor<6F><72><EFBFBD>ŵı<C5B5><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void translate(QPointF delta); // ƽ<><C6BD>
// ƽ<><C6BD><EFBFBD>ٶ<EFBFBD>
void setTranslateSpeed(qreal speed);

View File

@ -497,6 +497,7 @@ void ImagerOperationBase::WriteHdr()
outfile << "interleave = bil\n";
outfile << "data type = 12\n";
outfile << "bit depth = 12\n";
outfile << "byte order = 0\n";
outfile << "samples = " << getSampleCount() << "\n";
outfile << "bands = " << getBandCount() << "\n";
outfile << "lines = " << m_iFrameCounter << "\n";

View File

@ -399,6 +399,7 @@ void ResononNirImager::WriteHdr()
outfile << "interleave = bil\n";
outfile << "data type = 12\n";
outfile << "bit depth = 12\n";
outfile << "byte order = 0\n";
outfile << "samples = " << getSampleCount() << "\n";
outfile << "bands = " << getBandCount() << "\n";
outfile << "lines = " << m_iFrameCounter << "\n";