/**
* Author: lwei
* Since: 2017.11.14
* Version: 1.0.0
*/
#include "pixmapwidget.h"
#include <QDebug>
#include <QPainter>
#include <QPaintEvent>
#include <QWheelEvent>
#include <QMatrix>
#define DEFAULT_SCALE 1.0
#define MAX_SCALE 3.0
#define MIN_SCALE 0.5
#define MAX_ROTATE 360
#define MIN_ROTATE 0
#define DEFAULT_ROTATE 0
//鼠标滚轮的距离会在计算数字的时候乘以8
#define RATIO_TO_DOULBE (8 * 360)
PixmapWidget::PixmapWidget(QWidget *parent) :
QWidget(parent),
m_pixmapPath(QString()),
m_scale(DEFAULT_SCALE),
m_rotationAngle(DEFAULT_ROTATE)
{
}
QString PixmapWidget::pixmapPath() const
{
return m_pixmapPath;
}
void PixmapWidget::setPixmapPath(const QString &pixmapPath)
{
if(m_pixmapPath != pixmapPath) {
m_pixmapPath = pixmapPath;
m_scale = DEFAULT_SCALE;
m_rotationAngle = DEFAULT_ROTATE;
}
}
int PixmapWidget::rotationAngle() const
{
return m_rotationAngle;
}
void PixmapWidget::setRotationAngle(int rotationAngle)
{
m_rotationAngle = rotationAngle;
}
void PixmapWidget::execScale(bool scaleFalg, double scale)
{
if(scaleFalg) {
m_scale += scale;
} else {
m_scale -= scale;
}
limitScale();
update();
}
void PixmapWidget::execRotate(int rotateSize)
{
m_rotationAngle += rotateSize;
while(m_rotationAngle < MIN_ROTATE || m_rotationAngle > MAX_ROTATE) {
if(m_rotationAngle < MIN_ROTATE) {
m_rotationAngle += MAX_ROTATE;
}
if(m_rotationAngle > MAX_ROTATE) {
m_rotationAngle -= MAX_ROTATE;
}
}
update();
}
void PixmapWidget::paintEvent(QPaintEvent *event)
{
QPixmap pixmap;
pixmap.load(m_pixmapPath);
QMatrix matrix;
matrix.rotate(m_rotationAngle);
pixmap = pixmap.transformed(matrix, Qt::FastTransformation);
int pixmapWidth = pixmap.width();
int pixmapHeight = pixmap.height();
QPoint widgetStartPos = this->pos();
int painterWidth = pixmapWidth * m_scale;
int painterHeight = pixmapHeight * m_scale;
int widgetWidth = this->width();
int widgetHeight = this->height();
QPoint startPos(widgetStartPos.x() + widgetWidth/2 - painterWidth/2,
widgetStartPos.y() + widgetHeight/2 - painterHeight/2);
QPainter painter(this);
painter.drawPixmap(QRect(startPos.x(), startPos.y(), painterWidth, painterHeight),
pixmap);
QWidget::paintEvent(event);
}
void PixmapWidget::wheelEvent(QWheelEvent *event)
{
int value = event->delta();
double scaleRatio = ((double)value)/RATIO_TO_DOULBE;
m_scale += scaleRatio;
limitScale();
update();
event->accept();
}
void PixmapWidget::limitScale()
{
m_scale = m_scale > MAX_SCALE ? MAX_SCALE : (m_scale < MIN_SCALE ?
MIN_SCALE : m_scale);
}