Files
2024-02-27 14:55:21 +08:00

146 lines
4.6 KiB
C++

#include "qimagewidget.h"
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsSceneDragDropEvent>
#include <QPointF>
#include <QDebug>
#include <QDrag>
#include <QLabel>
#include <QWidgetAction>
#include <QMenu>
#include <math.h>
QImageWidget::QImageWidget(QImage* pixmap)
{
m_pix = *pixmap;
//setAcceptDrops(true);//If enabled is true, this item will accept hover events; otherwise, it will ignore them. By default, items do not accept hover events.
m_scaleValue = 0;
m_scaleDafault = 0;
m_isMove = false;
}
QRectF QImageWidget::boundingRect() const
{
return QRectF(-m_pix.width() / 2, -m_pix.height() / 2,
m_pix.width(), m_pix.height());
}
void QImageWidget::paint(QPainter* painter, const QStyleOptionGraphicsItem*,
QWidget*)
{
painter->setRenderHints(QPainter::SmoothPixmapTransform);//消锯齿
painter->drawImage(-m_pix.width() / 2, -m_pix.height() / 2, m_pix);
}
void QImageWidget::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
m_startPos = event->pos();//鼠标左击时,获取当前鼠标在图片中的坐标,
m_isMove = true;//标记鼠标左键被按下
GetImagepix(m_startPos);
}
else if (event->button() == Qt::RightButton)
{
ResetItemPos();//右击鼠标重置大小
}
}
void QImageWidget::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
if (m_isMove)
{
QPointF point = (event->pos() - m_startPos) * m_scaleValue;
moveBy(point.x(),point.y() );
}
}
void QImageWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent*)
{
m_isMove = false;//标记鼠标左键已经抬起
}
void QImageWidget::wheelEvent(QGraphicsSceneWheelEvent* event)//鼠标滚轮事件
{
if ((event->delta() > 0) && (m_scaleValue >= m_max_zoomState))//最大放大到原始图像的50倍
{
return;
}
else if ((event->delta() < 0) && (m_scaleValue <= m_scaleDafault))//图像缩小到自适应大小之后就不继续缩小
{
ResetItemPos();//重置图片大小和位置,使之自适应控件窗口大小
}
else
{
qreal qrealOriginScale = m_scaleValue;
if (event->delta() > 0)//鼠标滚轮向前滚动
{
m_scaleValue *= 1+ m_zoom;//每次放大10%
}
else
{
m_scaleValue *= 1- m_zoom;//每次缩小10%
}
setScale(m_scaleValue);//缩放基准是固定的,即对原图元缩放,无累加
if (event->delta() > 0)
{
moveBy(-event->pos().x() * qrealOriginScale * m_zoom, -event->pos().y() * qrealOriginScale * 0.1);//使图片缩放的效果看起来像是以鼠标所在点为中心进行缩放的
}
else
{
moveBy(event->pos().x() * qrealOriginScale * m_zoom, event->pos().y() * qrealOriginScale * 0.1);//使图片缩放的效果看起来像是以鼠标所在点为中心进行缩放的
}
}
}
//将主界面的控件QGraphicsView的width和height传进本类中,并根据图像的长宽和控件的长宽的比例来使图片缩放到适合控件的大小
void QImageWidget::setQGraphicsViewWH(int nwidth, int nheight)
{
int nImgWidth = m_pix.width();
int nImgHeight = m_pix.height();
qreal temp1 = nwidth * 1.0 / nImgWidth;
qreal temp2 = nheight * 1.0 / nImgHeight;
if (temp1 > temp2)
{
m_scaleDafault = temp2;
}
else
{
m_scaleDafault = temp1;
}
setScale(m_scaleDafault);
m_scaleValue = m_scaleDafault;
}
void QImageWidget::GetImagepix(QPointF pos)
{
int a=pos.x()+m_pix.width()/2;
int b=pos.y()+m_pix.height()/2;
if(m_pix.isNull())return;
if(m_pix.valid(a, b)){
QColor color = m_pix.pixel(a, b);
QString clo=QString("RGB: %1, %2, %3").arg(color.red()).arg(color.green()).arg(color.blue());
QString ps=QString("XY:(%1,%2) %3").arg(a).arg(b).arg(clo);
emit SetImagepix(ps);
}
// QMenu* menu = new QMenu();
// menu->setStyleSheet("QMenu { background-color:rgb(3,101,100); border: 5px solid rgb(3,54,73); }");
// QLabel* label=new QLabel(menu);
// label->setText(ps);
// QWidgetAction* another_widgetAction = new QWidgetAction(menu);
// another_widgetAction->setDefaultWidget(label);
// menu->addAction(another_widgetAction);
// menu->exec(QCursor::pos());
// delete menu;
}
//重置图片位置
void QImageWidget::ResetItemPos()
{
m_scaleValue = m_scaleDafault;//缩放比例回到一开始的自适应比例
setScale(m_scaleDafault);//缩放到一开始的自适应大小
setPos(0, 0);
}
qreal QImageWidget::getScaleValue() const
{
return m_scaleValue;
}