[Add] Added zoom and pan for preview widget.

This commit is contained in:
Rtch90 2014-12-19 10:13:11 +00:00
parent 66a81ca6e7
commit af5b34aba6
3 changed files with 84 additions and 12 deletions

View File

@ -9,7 +9,6 @@ PDFPageWidget::PDFPageWidget(QWidget* parent) :
selected = false;
setAcceptDrops(true);
/* Resize widget. */
this->resize(150, 150);
this->setMinimumSize(150, 150);
this->setMaximumSize(150, 150);

View File

@ -1,7 +1,9 @@
#include <QtWidgets>
#include "pdf_preview_widget.h"
PDFPreviewWidget::PDFPreviewWidget(QWidget* parent) : QWidget(parent) {
PDFPreviewWidget::PDFPreviewWidget(QWidget* parent) : QFrame(parent) {
setCursor(Qt::OpenHandCursor);
setFrameStyle(QFrame::StyledPanel | QFrame::Plain);
pPage = NULL;
currentPixmapSize = QSize(0,0);
}
@ -23,14 +25,35 @@ void PDFPreviewWidget::regenImage(void) {
previewImage = pPage->renderToImage(dpi, dpi);
}
void PDFPreviewWidget::regenPixmap(void) {
pixmap = QPixmap::fromImage(previewImage);
pixmap = pixmap.scaled(currentPixmapSize, Qt::KeepAspectRatioByExpanding);
currentPixmapSize = pixmap.size();
}
void PDFPreviewWidget::repositionPixmap(void) {
currentPixmapPos = QPoint((size().width() - pixmap.width()) / 2,
(size().height() - pixmap.height()) / 2);
}
void PDFPreviewWidget::previewUpdate(Poppler::Page* pp) {
pPage = pp;
regenImage();
regenPixmap();
repositionPixmap();
update();
}
void PDFPreviewWidget::resizeEvent(QResizeEvent* event) {
if(pPage != NULL) {
repositionPixmap();
update();
}
}
void PDFPreviewWidget::wheelEvent(QWheelEvent* event) {
if(pPage != NULL) {
qDebug() << currentPixmapSize;
if(event->delta() > 0)
currentPixmapSize += QSize(30, 30);
else if(event->delta() < 0)
@ -41,20 +64,59 @@ void PDFPreviewWidget::wheelEvent(QWheelEvent* event) {
}
regenImage();
regenPixmap();
repositionPixmap();
update();
}
}
void PDFPreviewWidget::mousePressEvent(QMouseEvent* event) {
if(pPage != NULL) {
setCursor(Qt::ClosedHandCursor);
if(event->button() == Qt::LeftButton) {
dragStartPos = event->pos();
lastPixmapPos = currentPixmapPos;
}
}
}
void PDFPreviewWidget::mouseMoveEvent(QMouseEvent* event) {
if(pPage != NULL) {
if(!(event->buttons() & Qt::LeftButton)) {
return;
}
QPoint currentPos = event->pos();
QPoint vector = currentPos - dragStartPos;
QPoint newPos = lastPixmapPos + vector;
if(pixmap.width() > size().width()) {
if(newPos.x() <= 0 && newPos.x() >= size().width() - pixmap.width())
currentPixmapPos.setX(newPos.x());
}
if(pixmap.height() > size().height()) {
if(newPos.y() <= 0 && newPos.y() >= size().height() - pixmap.height())
currentPixmapPos.setY(newPos.y());
}
update();
}
}
void PDFPreviewWidget::mouseReleaseEvent(QMouseEvent* event) {
setCursor(Qt::OpenHandCursor);
}
void PDFPreviewWidget::paintEvent(QPaintEvent* event) {
if(pPage != NULL) {
QPainter painter(this);
QPixmap pixmap = QPixmap::fromImage(previewImage);
pixmap = pixmap.scaled(currentPixmapSize, Qt::KeepAspectRatio);
currentPixmapSize = pixmap.size();
painter.drawPixmap(QRect((size().width() - pixmap.width()) / 2,
(size().height() - pixmap.height()) / 2,
painter.drawPixmap(QRect(currentPixmapPos.x(), currentPixmapPos.y(),
pixmap.width(), pixmap.height()), pixmap);
QFrame::paintEvent(event);
}
}

View File

@ -1,33 +1,44 @@
#pragma once
#include <QWidget>
#include <QFrame>
#include <poppler-qt5.h>
class QImage;
class QPixmap;
class QSize;
class QPoint;
class QResizeEvent;
class QWheelEvent;
class QPaintEvent;
class QMouseEvent;
class PDFPreviewWidget : public QWidget {
class PDFPreviewWidget : public QFrame {
Q_OBJECT
public:
explicit PDFPreviewWidget(QWidget* parent = 0);
public slots:
void regenImage(void);
void regenPixmap(void);
void repositionPixmap(void);
void previewUpdate(Poppler::Page*);
protected:
void wheelEvent(QWheelEvent* event);
void paintEvent(QPaintEvent* event);
void resizeEvent(QResizeEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
private:
QImage previewImage;
QPixmap pixmap;
Poppler::Page* pPage;
QSize currentPixmapSize;
QPoint currentPixmapPos;
QPoint lastPixmapPos;
QPoint dragStartPos;
signals:
void updatePreview(QImage);