You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
3.8 KiB
C++

5 years ago
#include "lpImgViewer.h"
#include <QResizeEvent>
#include <QWheelEvent>
#include <QRectF>
#include <iostream>
#include <QtDebug>
lpImgViewer::lpImgViewer(QWidget* parent /*= 0*/)
: QGraphicsView(parent), mpImgItem(NULL), mpInfoLabel(NULL), mpImg(NULL)
{
lpScene = new QGraphicsScene(parent);
setScene(lpScene);
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
}
lpImgViewer::lpImgViewer(QGraphicsScene *scene, QWidget *parent /*= 0*/)
: QGraphicsView(scene, parent), mpImgItem(NULL), mpInfoLabel(NULL), mpImg(NULL)
{
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
}
QGraphicsPixmapItem* lpImgViewer::setImg(QImage& img)
{
if (mpImg)
delete mpImg;
mpImg = new QImage(img);
if (!mpImgItem)
mpImgItem = scene()->addPixmap(QPixmap::fromImage(img));
else
mpImgItem->setPixmap(QPixmap::fromImage(img));
mpImgItem->setOffset(-img.width() / 2.0, -img.height() / 2.0);
mpImgItem->setPos(0, 0);
mImgOriSize = img.size();
qreal scale = std::min((qreal)size().width() / img.width(), (qreal)size().height() / img.height());
scaleImg2(scale);
mpImgItem->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
this->centerOn(0, 0);
return mpImgItem;
}
void lpImgViewer::wheelEvent(QWheelEvent *evt)
{
if (mpImgItem)
{
qreal numDegrees = evt->angleDelta().y() / 120;
qreal newScale = transform().m11();
if (numDegrees > 0)
newScale *= std::pow(1.1, numDegrees);
else if (numDegrees < 0)
newScale *= std::pow(0.9, -numDegrees);
qreal minScale = std::min((qreal)size().width() / mImgOriSize.width(), (qreal)size().height() / mImgOriSize.height());
mpImgItem->setTransformOriginPoint(0, 0);
scaleImg2(newScale);
}
}
void lpImgViewer::mouseMoveEvent(QMouseEvent *evt)
{
if (mpImgItem)
{
QPoint curpos = (mpImgItem->mapFromScene(this->mapToScene(evt->pos())) +
QPointF(mImgOriSize.width() / 2.0, mImgOriSize.height() / 2.0) + QPointF(-0.5, -0.5)).toPoint();
if (mpInfoLabel)
selectPixel(curpos);
else
emit pixelSelected(curpos);
}
if (mpImgItem && mpImgItem->isSelected())
{
QPointF pos = mpImgItem->scenePos();
qDebug() << pos;
emit imgMoved(pos);
}
QGraphicsView::mouseMoveEvent(evt);
}
void lpImgViewer::resizeEvent(QResizeEvent* evt)
{
QGraphicsView::resizeEvent(evt);
}
void lpImgViewer::mouseReleaseEvent(QMouseEvent *evt)
{
QGraphicsView::mouseReleaseEvent(evt);
if (mpImgItem)
mpImgItem->setSelected(false);
}
void lpImgViewer::closeEvent(QCloseEvent *evt)
{
deleteLater();
}
void lpImgViewer::moveImg(QPointF pos)
{
if (mpImgItem)
mpImgItem->setPos(pos);
}
void lpImgViewer::selectPixel(QPoint pos)
{
if (pos.x() < 0 || pos.y() < 0 || pos.x() > mImgOriSize.width() || pos.y() > mImgOriSize.height())
{
mpInfoLabel->setText(QString("out of image..."));
return;
}
if (!mpImg) {
mpInfoLabel->setText(QString("mpImg is null"));
}
QRgb pixel = mpImg->pixel(pos);
QColor rgb(pixel);
QColor hsv = rgb.toHsv();
QString infoStr("Position:[%1, %2] Color(RGB):[%3, %4, %5] (HSV):[%6, %7, %8]");
infoStr = infoStr.arg(pos.x()).arg(pos.y())
.arg(rgb.red()).arg(rgb.green()).arg(rgb.blue())
.arg(hsv.hue()/2).arg(hsv.saturation()).arg(hsv.value());
mpInfoLabel->setText(infoStr);
}
void lpImgViewer::scaleImg(QTransform tf, QPointF center)
{
this->resetTransform();
this->setTransform(tf);
this->centerOn(center);
}
void lpImgViewer::scaleImg2(qreal scale)
{
QTransform t;
t.scale(scale, scale);
this->setTransform(t);
QPointF center = this->mapToScene(width()/2, height()/2);
emit imgScaled(this->transform(), center);
}
void lpImgViewer::clear()
{
scene()->clear();
mpImgItem = NULL;
if (mpImg)
{
delete mpImg;
mpImg = NULL;
}
}