#include <QLabel>
#include <QWheelEvent>
#include <QMouseEvent>
#include <QPixmap>
#include <QPainter>
class slabel :public QLabel
{
public:
slabel(QWidget *parent = nullptr);
bool cmove=false;
double Width0;
double Height0;
double Width;
double Height;
double m_scaleValue0 = 2;
protected:
void paintEvent(QPaintEvent *) override;
void mouseMoveEvent(QMouseEvent *ev) override;
void mousePressEvent(QMouseEvent *ev) override;
void mouseReleaseEvent(QMouseEvent *ev) override;
void wheelEvent(QWheelEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
void changeWheelValue(QPoint event, int value);
double m_scaleValue; // 图片缩放倍数
QPointF m_drawPoint; // 绘图起点
QPointF m_mousePoint; // 鼠标当前位置点
QRect m_rectPixmap; // 被绘图片的矩形范围
bool m_isMousePress; // 鼠标是否按下
QLabel* infoLabel;
const double SCALE_MAX_VALUE = 20.0;//最大放大到原来的20倍
const double SCALE_MIN_VALUE = 0.1;//最小缩小到原来的0.1倍
};
#include "slabel.h"
slabel::slabel(QWidget *parent) :QLabel(parent)
, m_scaleValue(0.3)
, m_mousePoint(0, 0)
, m_drawPoint(0, 0)
, m_rectPixmap(0, 0, 0, 0)
, m_isMousePress(0)
{
infoLabel = new QLabel(this);
infoLabel->setStyleSheet("background-color: black; color: red; border: 1px solid black; padding: 5px;");
infoLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
infoLabel->setWordWrap(true);
infoLabel->setMinimumSize(200, 30);
}
void slabel::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap scalePixmap;
QRectF target;
if (this->pixmap()->width() !=this->pixmap()->height()) {
Width = this->pixmap()->width()*m_scaleValue;
Height = Width / this->pixmap()->width() * this->pixmap()->height();
}
else if(this->pixmap()->width() == this->pixmap()->height()){
Width = std::min(this->height(), this->width())*m_scaleValue;
Height = Width;
}
else {
Width = this->width();
Height = Width / 5096 * 2968;
}
if (!cmove) {
m_drawPoint = QPointF((this->width() - Width) / 2, (this->height() - Height) / 2);
m_rectPixmap = QRect(m_drawPoint.x(), m_drawPoint.y(), Width, Height); // 图片区域
}
else m_rectPixmap = QRect(m_drawPoint.x(), m_drawPoint.y(), Width, Height);
scalePixmap = this->pixmap()->scaled(Width, Height);
painter.drawPixmap(m_rectPixmap,scalePixmap);
}
void slabel::mouseMoveEvent(QMouseEvent *event)
{
if (m_isMousePress)
{
int x = event->pos().x() - m_mousePoint.x();
int y = event->pos().y() - m_mousePoint.y();
m_mousePoint = event->pos();
m_drawPoint = QPointF(m_drawPoint.x() + x, m_drawPoint.y() + y);
update();
}
}
void slabel::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_isMousePress = true;
m_mousePoint = event->pos();
cmove = true;
QPixmap pixmap = *(this->pixmap());
QImage img = pixmap.toImage();
int posx = (m_mousePoint.x()- m_drawPoint.x()) / m_scaleValue;
int posy = (m_mousePoint.y()- m_drawPoint.y()) / m_scaleValue;
if (m_mousePoint.x()- m_drawPoint.x() < Width && m_mousePoint.y()- m_drawPoint.y() < Height &&m_mousePoint.x()- m_drawPoint.x()>=0 &&m_mousePoint.y()- m_drawPoint.y()>=0 ){
int grayValue = qRed(img.pixel(posx,posy)); // 使用qRed获取灰度值
infoLabel->setText(QString("pos: (%1, %2), val: %3").arg(posx).arg(posy).arg(grayValue));
infoLabel->move(m_mousePoint.x(),m_mousePoint.y()); // Adjust the position of the info label
}
}
}
void slabel::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::RightButton)
{
cmove = false;
m_drawPoint = QPointF(0, 0);
m_scaleValue = m_scaleValue0;
update();
}
if (event->button() == Qt::LeftButton) m_isMousePress = false;
}
void slabel::wheelEvent(QWheelEvent *event)
{
changeWheelValue(event->pos(), event->delta());
event->accept();
}
void slabel::resizeEvent(QResizeEvent *event)
{
m_drawPoint = QPointF(0, 0);
m_scaleValue = m_scaleValue0;
update();
}
void slabel::changeWheelValue(QPoint event, int numSteps)
{
double oldScale = m_scaleValue;
if (numSteps>0)
{
m_scaleValue *= 2;
}
else
{
m_scaleValue *= 0.5;
}
if (m_scaleValue>(SCALE_MAX_VALUE))
{
m_scaleValue = SCALE_MAX_VALUE;
}
if (m_scaleValue<(SCALE_MIN_VALUE))
{
m_scaleValue = SCALE_MIN_VALUE;
}
if (m_rectPixmap.contains(event))
{
double x = m_drawPoint.x() - (event.x() - m_drawPoint.x()) / m_rectPixmap.width()*(this->width()*(m_scaleValue - oldScale));
double y = m_drawPoint.y() - (event.y() - m_drawPoint.y()) / m_rectPixmap.height()*(this->height()*(m_scaleValue - oldScale));
m_drawPoint = QPointF(x, y);
}
else
{
double x = m_drawPoint.x() - (this->width()*(m_scaleValue - oldScale)) / 2;
double y = m_drawPoint.y() - (this->height()*(m_scaleValue - oldScale)) / 2;
m_drawPoint = QPointF(x, y);
}
update();
}