[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; selected = false;
setAcceptDrops(true); setAcceptDrops(true);
/* Resize widget. */
this->resize(150, 150); this->resize(150, 150);
this->setMinimumSize(150, 150); this->setMinimumSize(150, 150);
this->setMaximumSize(150, 150); this->setMaximumSize(150, 150);

View File

@ -1,7 +1,9 @@
#include <QtWidgets> #include <QtWidgets>
#include "pdf_preview_widget.h" #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; pPage = NULL;
currentPixmapSize = QSize(0,0); currentPixmapSize = QSize(0,0);
} }
@ -23,14 +25,35 @@ void PDFPreviewWidget::regenImage(void) {
previewImage = pPage->renderToImage(dpi, dpi); 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) { void PDFPreviewWidget::previewUpdate(Poppler::Page* pp) {
pPage = pp; pPage = pp;
regenImage(); regenImage();
regenPixmap();
repositionPixmap();
update(); update();
} }
void PDFPreviewWidget::resizeEvent(QResizeEvent* event) {
if(pPage != NULL) {
repositionPixmap();
update();
}
}
void PDFPreviewWidget::wheelEvent(QWheelEvent* event) { void PDFPreviewWidget::wheelEvent(QWheelEvent* event) {
if(pPage != NULL) { if(pPage != NULL) {
qDebug() << currentPixmapSize;
if(event->delta() > 0) if(event->delta() > 0)
currentPixmapSize += QSize(30, 30); currentPixmapSize += QSize(30, 30);
else if(event->delta() < 0) else if(event->delta() < 0)
@ -41,20 +64,59 @@ void PDFPreviewWidget::wheelEvent(QWheelEvent* event) {
} }
regenImage(); regenImage();
regenPixmap();
repositionPixmap();
update(); 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) { void PDFPreviewWidget::paintEvent(QPaintEvent* event) {
if(pPage != NULL) { if(pPage != NULL) {
QPainter painter(this); QPainter painter(this);
QPixmap pixmap = QPixmap::fromImage(previewImage); painter.drawPixmap(QRect(currentPixmapPos.x(), currentPixmapPos.y(),
pixmap = pixmap.scaled(currentPixmapSize, Qt::KeepAspectRatio); pixmap.width(), pixmap.height()), pixmap);
currentPixmapSize = pixmap.size();
painter.drawPixmap(QRect((size().width() - pixmap.width()) / 2, QFrame::paintEvent(event);
(size().height() - pixmap.height()) / 2,
pixmap.width(), pixmap.height()), pixmap);
} }
} }

View File

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