1 // 2 // C++ Implementation: iview 3 // 4 // Description: 5 // 6 // 7 // Author: Pierre Marchand <pierremarc@oep-h.com>, (C) 2009 8 // 9 // Copyright: See COPYING file that comes with this distribution 10 // 11 // 12 13 #include "iview.h" 14 15 #include <QApplication> 16 #include <QMouseEvent> 17 #include <QScrollBar> 18 #include <QPolygonF> 19 #include <QDebug> 20 IView(QWidget * parent)21IView::IView ( QWidget * parent ) 22 :QGraphicsView ( parent ) 23 { 24 curImage = nullptr; 25 setScene ( new QGraphicsScene ); 26 setInteractive ( true ); 27 isPanning = false; 28 m_keepFitted = false; 29 setAlignment ( Qt::AlignTop | Qt::AlignLeft ); 30 setTransformationAnchor ( QGraphicsView::NoAnchor ); 31 setRenderHint(QPainter::SmoothPixmapTransform); 32 } 33 ~IView()34IView::~ IView() 35 { 36 QGraphicsScene * s(scene()); 37 delete s; 38 } 39 mouseMoveEvent(QMouseEvent * e)40void IView::mouseMoveEvent ( QMouseEvent * e ) 41 { 42 ////qDebug()<<"IView::mouseMoveEvent"; 43 if ( isPanning ) 44 { 45 QPointF pos ( e->pos() ); 46 int vDelta ( qRound ( mouseStartPoint.y() - pos.y() ) ); 47 int hDelta ( qRound ( mouseStartPoint.x() - pos.x() ) ); 48 verticalScrollBar()->setValue ( verticalScrollBar()->value() + vDelta ); 49 horizontalScrollBar()->setValue ( horizontalScrollBar()->value() + hDelta ); 50 mouseStartPoint = pos; 51 return; 52 } 53 } 54 mousePressEvent(QMouseEvent * e)55void IView::mousePressEvent ( QMouseEvent * e ) 56 { 57 //qDebug()<<"IView::mousePressEvent"; 58 if ( !scene() ) 59 return; 60 61 // if ( e->button() == Qt::MidButton ) 62 { 63 mouseStartPoint = e->pos() ; 64 isPanning = true; 65 QApplication::setOverrideCursor ( QCursor ( Qt::ClosedHandCursor ) ); 66 } 67 } 68 mouseReleaseEvent(QMouseEvent * e)69void IView::mouseReleaseEvent ( QMouseEvent * e ) 70 { 71 //qDebug()<<"IView::mouseReleaseEvent"; 72 if ( isPanning ) 73 { 74 isPanning = false; 75 QApplication::restoreOverrideCursor(); 76 return; 77 } 78 } 79 80 setImage(const QPixmap & pixmap)81void IView::setImage(const QPixmap & pixmap) 82 { 83 //qDebug()<<"IView::setImage"; 84 if ( curImage ) 85 { 86 delete curImage; 87 curImage = nullptr; 88 } 89 90 curImage = scene()->addPixmap ( pixmap ); 91 } 92 getPixmap()93QPixmap IView::getPixmap() 94 { 95 //qDebug()<<"IView::getPixmap"; 96 if ( curImage ) 97 { 98 return curImage->pixmap(); 99 } 100 return QPixmap(); 101 } 102 103 104 fitImage()105void IView::fitImage() 106 { 107 //qDebug()<<"IView::fitImage"; 108 if(!curImage) 109 return; 110 111 double wR = width() /curImage->boundingRect().width() ; 112 double hR = height()/ curImage->boundingRect().height(); 113 114 double R = (wR > hR) ? hR : wR; 115 QTransform T; 116 T.scale(R,R); 117 setTransform( T , false); 118 119 } 120 resizeEvent(QResizeEvent * event)121void IView::resizeEvent(QResizeEvent * event) 122 { 123 //qDebug()<<"View::resizeEvent"; 124 if(m_keepFitted) 125 fitImage(); 126 } 127 setZoom(double xz,double yz)128void IView::setZoom(double xz, double yz) 129 { 130 QTransform T; 131 T.scale(xz, (yz > 0) ? yz : xz); 132 setTransform( T , false); 133 } 134 getZoom() const135double IView::getZoom() const 136 { 137 return transform().m11(); 138 } 139 140