#include "lpImgViewer.h" #include #include #include #include #include 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; } }