#include "image_view.h" #include #include #include #include #include #include #include ImageView::ImageView(QWidget * parent): QGraphicsView(parent) { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setDragMode(QGraphicsView::NoDrag); setTransformationAnchor(QGraphicsView::AnchorUnderMouse); setScene(new QGraphicsScene()); setRenderHint(QPainter::Antialiasing, true); setRenderHint(QPainter::SmoothPixmapTransform, true); item.setTransformationMode(Qt::SmoothTransformation); item.setFlags(0); scene()->addItem(&item); viewport()->setAutoFillBackground(false); viewport()->installEventFilter(this); autofit_ = true; } ImageView::~ImageView() { } QPixmap ImageView::pixmap() const { return map; } void ImageView::setPixmap(QPixmap pixmap) { map = pixmap; adjustView(); } void ImageView::setImage(const QImage & i) { im_data.clear(); if (i.isNull()) { item.setPixmap(QPixmap()); map = QPixmap(); return; } QBuffer b(&im_data); b.open(QIODevice::ReadWrite); i.save(&b, "png"); b.close(); map = QPixmap::fromImage(i); adjustView(); } void ImageView::setImage(const QByteArray & i) { im_data = i; if (i.isEmpty()) { item.setPixmap(QPixmap()); map = QPixmap(); return; } map = QPixmap::fromImage(QImage::fromData(i)); adjustView(); } void ImageView::clear() { im_data.clear(); item.setPixmap(QPixmap()); map = QPixmap(); } void ImageView::mouseDoubleClickEvent(QMouseEvent * e) { autofit(); } void ImageView::mousePressEvent(QMouseEvent * e) { QGraphicsView::mousePressEvent(e); emit clicked(mapToScene(e->pos()), e->buttons()); } void ImageView::mouseMoveEvent(QMouseEvent * e) { //if (e->buttons().testFlag(Qt::RightButton) && !autofit_ && isInteractive()) return;; QGraphicsView::mouseMoveEvent(e); } //void ImageView::wheelEvent(QWheelEvent * e) { // if (!e->modifiers().testFlag(Qt::ControlModifier) || !isInteractive()) return; // double scl = 1. + e->delta() / 500.; // //autofit_ = false; // //scale(scl, scl); //} bool ImageView::eventFilter(QObject * o, QEvent * e) { QMouseEvent * me = (QMouseEvent *)e; switch (e->type()) { case QEvent::Resize: adjustView(); break; case QEvent::MouseButtonPress: prev_pos = me->pos(); break; case QEvent::MouseMove: if (!me->buttons().testFlag(Qt::RightButton) || autofit_ || !isInteractive()) break; { //double scl = 1. / qSqrt(transform().determinant()); //QPointF dp = QPointF(me->pos() - prev_pos) * scl; //qDebug() << dp; //translate(0.00001, 0); prev_pos = me->pos(); } break; default: break; } return QGraphicsView::eventFilter(o, e); } void ImageView::adjustView() { qreal mp = map.width() / map.size().boundedTo(size()).width(); if (mp > 2) { item.setPixmap(map.scaled(map.size()/mp, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } else { item.setPixmap(map); } if (!autofit_) return; setSceneRect(item.boundingRect()); fitInView(&item, Qt::KeepAspectRatio); centerOn(&item); } void ImageView::autofit() { autofit_ = true; adjustView(); }