#include "lts_image_cropper.h" #include #include #include namespace LtsWidgets { LtsImageCropper::LtsImageCropper(QWidget *parent, const QSize &size, const QPixmap &pixmap) : QGraphicsView(parent) , m_scene(new QGraphicsScene(this)) , m_maxScale(2.0f) , m_multiplier(1.0f) { if(!size.isNull()) setFixedSize(size); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setFrameStyle(QFrame::NoFrame); setDragMode(QGraphicsView::ScrollHandDrag); setTransformationAnchor(QGraphicsView::AnchorViewCenter); m_scene->setBackgroundBrush(Qt::Dense6Pattern); setScene(m_scene); setPixmap(pixmap); } LtsImageCropper::~LtsImageCropper() { delete m_pixmapItem; } void LtsImageCropper::setPixmap(const QPixmap &pixmap) { if(pixmap.isNull()) return; delete m_pixmapItem; m_pixmapItem = new QGraphicsPixmapItem(pixmap); m_scene->addItem(m_pixmapItem); setTransform(QTransform()); m_currentZoom = 1.0; double sx = static_cast(size().height()) / pixmap.height(); double sy = static_cast(size().width()) / pixmap.width(); if(sx > 1 ) scale(sx,sx); if(sy > 1) scale(sy,sy); double ratioWidth = 1.0 * size().width() / pixmap.width(); double ratioHeight = 1.0 * size().height() / pixmap.height(); m_minScale = qMax(ratioHeight,ratioWidth); calculateScaleStep(); m_scene->setSceneRect(pixmap.rect()); centerOn(m_scene->sceneRect().center()); } void LtsImageCropper::setImage(const QImage &image) { setPixmap(QPixmap::fromImage(image)); } void LtsImageCropper::setMultiplier(double multiplier) { m_multiplier = multiplier; calculateScaleStep(); } void LtsImageCropper::calculateScaleStep() { m_stepScale = (m_maxScale - m_minScale) / 100.0; } QImage LtsImageCropper::image() { return grab().toImage(); } void LtsImageCropper::wheelEvent(QWheelEvent *event) { if(!m_pixmapItem) return; auto value = event->pixelDelta(); if(value.isNull()) value = event->angleDelta() / 15.0; double scrollZoom = m_stepScale * value.y() * m_multiplier / 8.0; m_currentZoom += scrollZoom; if(m_currentZoom > m_maxScale) m_currentZoom = m_maxScale; else if (m_currentZoom < m_minScale) m_currentZoom = m_minScale; setTransform(QTransform(m_currentZoom, transform().m12(), transform().m13(), transform().m21(), m_currentZoom, transform().m23(), transform().m31(), transform().m32(), 1)); } void LtsImageCropper::mousePressEvent(QMouseEvent *event) { QApplication::setOverrideCursor(Qt::DragMoveCursor); update(); QGraphicsView::mousePressEvent(event); } void LtsImageCropper::mouseReleaseEvent(QMouseEvent *event) { QApplication::restoreOverrideCursor(); update(); QGraphicsView::mouseReleaseEvent(event); } }