Zoom support
This commit is contained in:
+72
-2
@@ -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)
|
||||||
@@ -42,7 +89,30 @@ 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());
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user