Zoom support
This commit is contained in:
+74
-4
@@ -2,8 +2,10 @@
|
||||
#include <QMouseEvent>
|
||||
#include <QScrollBar>
|
||||
#include <QKeyEvent>
|
||||
#include <QDebug>
|
||||
|
||||
ImageScrollArea::ImageScrollArea(QWidget *parent) : QScrollArea(parent)
|
||||
ImageScrollArea::ImageScrollArea(QWidget *parent) : QScrollArea(parent),
|
||||
m_scale(-1)
|
||||
{
|
||||
m_label = new QLabel(this);
|
||||
setWidget(m_label);
|
||||
@@ -12,9 +14,54 @@ ImageScrollArea::ImageScrollArea(QWidget *parent) : QScrollArea(parent)
|
||||
void ImageScrollArea::setImage(const QPixmap &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->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)
|
||||
@@ -42,7 +89,30 @@ void ImageScrollArea::mousePressEvent(QMouseEvent *event)
|
||||
|
||||
void ImageScrollArea::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
m_label->setPixmap(m_pixmap.scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
m_label->resize(event->size());
|
||||
if(m_scale < 0)
|
||||
{
|
||||
m_label->setPixmap(m_pixmap.scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||
m_label->resize(event->size());
|
||||
}
|
||||
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
|
||||
{
|
||||
Q_OBJECT
|
||||
QPoint m_lastPos;
|
||||
QLabel *m_label;
|
||||
QPixmap m_pixmap;
|
||||
float m_scale;
|
||||
public:
|
||||
explicit ImageScrollArea(QWidget *parent = 0);
|
||||
void setImage(const QPixmap &img);
|
||||
void setScale(float scale);
|
||||
public slots:
|
||||
void zoomIn();
|
||||
void zoomOut();
|
||||
void bestFit();
|
||||
void oneToOne();
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent *event);
|
||||
void keyReleaseEvent(QKeyEvent *event);
|
||||
void mouseMoveEvent(QMouseEvent *event);
|
||||
void mousePressEvent(QMouseEvent *event);
|
||||
void resizeEvent(QResizeEvent *event);
|
||||
void wheelEvent(QWheelEvent *event);
|
||||
};
|
||||
|
||||
#endif // IMAGESCROLLAREA_H
|
||||
|
||||
+6
-1
@@ -25,7 +25,12 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
|
||||
fileMenu->addAction(tr("Exit"), this, SLOT(close()));
|
||||
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()
|
||||
|
||||
Reference in New Issue
Block a user