Zoom support

This commit is contained in:
2016-07-30 16:08:06 +02:00
parent b44ff27f54
commit a679efa11a
3 changed files with 89 additions and 5 deletions
+72 -2
View File
@@ -2,8 +2,10 @@
#include <QMouseEvent> #include <QMouseEvent>
#include <QScrollBar> #include <QScrollBar>
#include <QKeyEvent> #include <QKeyEvent>
#include <QDebug>
ImageScrollArea::ImageScrollArea(QWidget *parent) : QScrollArea(parent) ImageScrollArea::ImageScrollArea(QWidget *parent) : QScrollArea(parent),
m_scale(-1)
{ {
m_label = new QLabel(this); m_label = new QLabel(this);
setWidget(m_label); setWidget(m_label);
@@ -12,9 +14,54 @@ ImageScrollArea::ImageScrollArea(QWidget *parent) : QScrollArea(parent)
void ImageScrollArea::setImage(const QPixmap &img) void ImageScrollArea::setImage(const QPixmap &img)
{ {
m_pixmap = img; m_pixmap = img;
QPixmap pix = img.scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); QPixmap pix;
if(m_scale < 0)
pix = img.scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
else
pix = img.scaled(img.size() * m_scale, Qt::KeepAspectRatio, Qt::SmoothTransformation);
m_label->setPixmap(pix); m_label->setPixmap(pix);
m_label->resize(pix.size()); m_label->resize(pix.size());
horizontalScrollBar()->setValue(horizontalScrollBar()->maximum() / 2);
verticalScrollBar()->setValue(verticalScrollBar()->maximum() / 2);
}
void ImageScrollArea::setScale(float scale)
{
if(scale > 4 || (scale < 0.2 && scale > 0))
return;
m_scale = scale;
QSize newSize = m_scale < 0 ? size() : m_pixmap.size()*scale;
m_label->setPixmap(m_pixmap.scaled(newSize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
m_label->resize(newSize);
}
void ImageScrollArea::zoomIn()
{
if(m_scale < 0)
m_scale = (float)size().width()/m_pixmap.size().width();
setScale(m_scale + 0.1);
}
void ImageScrollArea::zoomOut()
{
if(m_scale < 0)
m_scale = (float)size().width()/m_pixmap.size().width();
setScale(m_scale - 0.1);
}
void ImageScrollArea::bestFit()
{
setScale(-1);
}
void ImageScrollArea::oneToOne()
{
setScale(1);
} }
void ImageScrollArea::keyPressEvent(QKeyEvent *event) void ImageScrollArea::keyPressEvent(QKeyEvent *event)
@@ -41,8 +88,31 @@ void ImageScrollArea::mousePressEvent(QMouseEvent *event)
} }
void ImageScrollArea::resizeEvent(QResizeEvent *event) void ImageScrollArea::resizeEvent(QResizeEvent *event)
{
if(m_scale < 0)
{ {
m_label->setPixmap(m_pixmap.scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); m_label->setPixmap(m_pixmap.scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
m_label->resize(event->size()); m_label->resize(event->size());
}
QScrollArea::resizeEvent(event); QScrollArea::resizeEvent(event);
} }
void ImageScrollArea::wheelEvent(QWheelEvent *event)
{
if(m_scale < 0)
m_scale = (float)size().width()/m_pixmap.size().width();
QPointF top(horizontalScrollBar()->value(), verticalScrollBar()->value());
QPointF mousePos = (top + event->posF()) / m_scale;
QPoint delta = event->angleDelta();
if(delta.y() > 0)
setScale(m_scale + 0.1);
else
setScale(m_scale - 0.1);
mousePos *= m_scale;
top = mousePos - event->posF();
horizontalScrollBar()->setValue(top.x());
verticalScrollBar()->setValue(top.y());
}
+9
View File
@@ -6,18 +6,27 @@
class ImageScrollArea : public QScrollArea class ImageScrollArea : public QScrollArea
{ {
Q_OBJECT
QPoint m_lastPos; QPoint m_lastPos;
QLabel *m_label; QLabel *m_label;
QPixmap m_pixmap; QPixmap m_pixmap;
float m_scale;
public: public:
explicit ImageScrollArea(QWidget *parent = 0); explicit ImageScrollArea(QWidget *parent = 0);
void setImage(const QPixmap &img); void setImage(const QPixmap &img);
void setScale(float scale);
public slots:
void zoomIn();
void zoomOut();
void bestFit();
void oneToOne();
protected: protected:
void keyPressEvent(QKeyEvent *event); void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event);
void mouseMoveEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event);
void resizeEvent(QResizeEvent *event); void resizeEvent(QResizeEvent *event);
void wheelEvent(QWheelEvent *event);
}; };
#endif // IMAGESCROLLAREA_H #endif // IMAGESCROLLAREA_H
+6 -1
View File
@@ -25,7 +25,12 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
fileMenu->addAction(tr("Exit"), this, SLOT(close())); fileMenu->addAction(tr("Exit"), this, SLOT(close()));
menuBar()->addMenu(fileMenu); menuBar()->addMenu(fileMenu);
m_ringList->setDir("/home/nou/Obrázky/jap/dusan-jpg"); QMenu *viewMenu = new QMenu(tr("View"), this);
viewMenu->addAction(tr("Zoom In"), m_image, SLOT(zoomIn()), QKeySequence::ZoomIn);
viewMenu->addAction(tr("Zoom Out"), m_image, SLOT(zoomOut()), QKeySequence::ZoomOut);
viewMenu->addAction(tr("Best Fit"), m_image, SLOT(bestFit()), QKeySequence("Ctrl+1"));
viewMenu->addAction(tr("1:1"), m_image, SLOT(oneToOne()));
menuBar()->addMenu(viewMenu);
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()