PlotterHMI/datafile/view/mygraphicsview.cpp

241 lines
6.9 KiB
C++
Raw Normal View History

2024-02-06 06:19:53 +00:00
#include "mygraphicsview.h"
MyGraphicsView::MyGraphicsView()
{
m_viewSize = this->size();
m_scene = new MyGraphicsScene();
this->setScene(m_scene);
setMouseTracking(true); // 跟踪鼠标位置
// this->setRenderHint(QPainter::Antialiasing, true);
// this->setRenderHint(QPainter::SmoothPixmapTransform, true);//防锯齿
}
MyGraphicsView::~MyGraphicsView()
{
if(m_scene != NULL)
{
delete m_scene;
m_scene = NULL;
}
}
void MyGraphicsView::resizeEvent(QResizeEvent *event)
{
if(event == NULL){}//为了去掉警告
if(m_scene != NULL && m_viewSize != this->size())
{
QRectF rectItem = m_scene->itemsBoundingRect();
this->setScene(m_scene);
this->fitInView(rectItem, Qt::KeepAspectRatio);
}
m_viewSize = this->size();
}
void MyGraphicsView::mouseDoubleClickEvent(QMouseEvent *event)
{
qreal scaleFactor = this->matrix().m11();
if(scaleFactor >= 20){return;}
if(event->button() == Qt::LeftButton &&
event->type() == QEvent::MouseButtonDblClick)
{
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
scale(2.0, 2.0);
}
if(event->button() == Qt::RightButton &&
event->type() == QEvent::MouseButtonDblClick)
{
QRectF rectItem = m_scene->itemsBoundingRect();
this->fitInView(rectItem, Qt::KeepAspectRatio);
}
}
void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
setDragMode(QGraphicsView::RubberBandDrag);
m_leftBtnPressed = true;
m_startPoint = m_endPoint = event->pos();
}
else
{
setDragMode(QGraphicsView::NoDrag);
}
if(event->button() == Qt::RightButton)
{
m_startPoint = event->pos();
m_rightBtnPressed = true;
}
QGraphicsView::mousePressEvent(event);
}
//恢复原状
void MyGraphicsView::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
m_leftBtnPressed = false;
if(m_startPoint.x() == m_endPoint.x() || m_startPoint.y() == m_endPoint.y())
{
return;
}
double cx = (m_endPoint.x() + m_startPoint.x()) / 2.0;
double cy = (m_endPoint.y() + m_startPoint.y()) / 2.0;
// 获取当前鼠标相对于scene的位置;
QPointF scenePos = this->mapToScene(QPoint(cx,cy));
// 获取view的宽高;
qreal viewWidth = this->viewport()->width();
qreal viewHeight = this->viewport()->height();
// 获取当前鼠标位置相当于view大小的横纵比例;
qreal hScale = cx / viewWidth;
qreal vScale = cy / viewHeight;
this->scale(2.0, 2.0);
// 将scene坐标转换为放大缩小后的坐标;
QPointF viewPoint = this->matrix().map(scenePos);
// 通过滚动条控制view放大缩小后的展示scene的位置;
horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale));
verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale));
}
if(event->button() == Qt::RightButton)
{
m_rightBtnPressed = false;
}
}
void MyGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
//QGraphicsView坐标
QPoint viewPoint = event->pos();
//QGraphicsScene坐标
QPointF scenePoint = mapToScene(viewPoint);
// double x = scenePoint.x() / MMPIXELY;
// double y = abs(abs(scenePoint.y()) - m_scene->itemsBoundingRect().height()) / MMPIXELY;
double x = (scenePoint.x() - DRAWMARGINS/2.0) / MMPIXELY;
double y = (m_scene->itemsBoundingRect().height() - scenePoint.y() + DRAWMARGINS/2.0) / MMPIXELY;
2024-02-06 06:19:53 +00:00
scenePoint.setX(x);
scenePoint.setY(y);
setMouseTracking(true);
siMouseMove(scenePoint);
if(m_leftBtnPressed)
{
m_endPoint = event->pos();
}
if(m_rightBtnPressed)
{
QPoint delta = m_startPoint - event->pos();
int hValue = horizontalScrollBar()->value();
int vValue = verticalScrollBar()->value();
horizontalScrollBar()->setValue(delta.x() + hValue);
verticalScrollBar()->setValue(delta.y() + vValue);
m_startPoint = event->pos();
}
QGraphicsView::mouseMoveEvent(event);
}
void MyGraphicsView::wheelEvent(QWheelEvent *event)
{
// 获取当前鼠标相对于view的位置;
QPointF cursorPoint = event->pos();
// 获取当前鼠标相对于scene的位置;
QPointF scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y()));
// 获取view的宽高;
qreal viewWidth = this->viewport()->width();
qreal viewHeight = this->viewport()->height();
// 获取当前鼠标位置相当于view大小的横纵比例;
qreal hScale = cursorPoint.x() / viewWidth;
qreal vScale = cursorPoint.y() / viewHeight;
int wheelDeltaValue = event->delta();
// 向上滚动,放大;
if (wheelDeltaValue > 0)
{
this->scale(1.2, 1.2);
}
// 向下滚动,缩小;
else
{
this->scale(1.0 / 1.2, 1.0 / 1.2);
}
// 将scene坐标转换为放大缩小后的坐标;
QPointF viewPoint = this->matrix().map(scenePos);
// 通过滚动条控制view放大缩小后的展示scene的位置;
horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale));
verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale));
}
2024-03-22 07:58:53 +00:00
CreatPictureStr MyGraphicsView::getPictureByDat(Marker marker,int paperWidth,int butSpace,int rightSpace,int penWidth)
2024-02-06 06:19:53 +00:00
{
2024-03-22 07:58:53 +00:00
CreatPictureStr picStr;
2024-02-06 06:19:53 +00:00
if(m_scene != NULL)
{
2024-03-22 07:58:53 +00:00
picStr = m_scene->getPictureByDat(marker,paperWidth,butSpace,rightSpace,penWidth);
m_scene->addItemToScene();
QRectF rectItem = m_scene->itemsBoundingRect();
this->fitInView(rectItem, Qt::KeepAspectRatio);
2024-02-06 06:19:53 +00:00
}
2024-03-22 07:58:53 +00:00
return picStr;
2024-02-06 06:19:53 +00:00
}
2024-03-22 07:58:53 +00:00
CreatPictureStr MyGraphicsView::getPictureByBmp(QPixmap pixmap,int paperWidth,int butSpace,int rightSpace,int penWidth)
2024-02-06 06:19:53 +00:00
{
2024-03-22 07:58:53 +00:00
CreatPictureStr picStr;
2024-02-06 06:19:53 +00:00
if(m_scene != NULL)
{
2024-03-22 07:58:53 +00:00
picStr = m_scene->getPictureByBmp(pixmap,paperWidth,butSpace,rightSpace,penWidth);
m_scene->addItemToScene();
2024-02-06 06:19:53 +00:00
QRectF rectItem = m_scene->itemsBoundingRect();
this->fitInView(rectItem, Qt::KeepAspectRatio);
}
2024-03-22 07:58:53 +00:00
return picStr;
2024-02-06 06:19:53 +00:00
}
void MyGraphicsView::cleanView()
{
if(m_scene != NULL)
{
//这里delete掉再重新new是因为view显示完大图再显示小图图形会不居中未找到其他解决方法
delete m_scene;
m_scene = NULL;
m_scene = new MyGraphicsScene();
this->setScene(m_scene);
}
}
void MyGraphicsView::swithViewByPic(QPicture pic)
{
if(m_scene != NULL)
{
m_scene->swithSceneByPic(pic);
QRectF rectItem = m_scene->itemsBoundingRect();
this->fitInView(rectItem, Qt::KeepAspectRatio);
}
}
2024-02-06 06:19:53 +00:00
void MyGraphicsView::reflushBlockView(QPoint p)
{
if(m_scene != NULL)
{
2024-03-22 07:58:53 +00:00
m_scene->reflushBlockScene(p);
2024-02-06 06:19:53 +00:00
}
}