想要将继承QGraphicsView的子类视图进行缩放(以鼠标点击位置缩放)和拖拽需要重写下面的父类方法。
void wheelEvent(QWheelEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *mouseEvent) override;
QPoint m_lastPointF;//记录当前鼠标位置
bool m_bIsPressed;//记录鼠标是否按下
double m_dOriScale;//视图的原始比例
构造函数中设置视图样式和开放必要属性功能
ImageGraphicsView::ImageGraphicsView()
{
setDragMode(QGraphicsView::NoDrag);
m_dOriScale = 1;//图形原始比例为1
setStyleSheet("padding: 0px; border: 0px;");//无边框
setMouseTracking(true);//允许跟踪鼠标位置
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏水平条
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏竖条
//以鼠标点击点为中心放缩需要加下面两句
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
}
void ImageGraphicsView::wheelEvent(QWheelEvent *event)
{
if ((event->delta() > 0) && (m_dOriScale >= 50))//最大放大到原始图像的50倍
return;
else if ((event->delta() < 0) && (m_dOriScale <= 0.01))//图像缩小到自适应大小之后就不继续缩小
return;
qreal scaleFactor = this->matrix().m11();
m_dOriScale = scaleFactor;
int wheelDeltaValue = event->delta();
if (wheelDeltaValue > 0)//放大
this->scale(1.2, 1.2);
else//缩小
this->scale(1.0 / 1.2, 1.0 / 1.2);
update();
}
void ImageGraphicsView::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_lastPointF = event->pos();
m_bIsPressed = true;
}
QGraphicsView::mousePressEvent(event);
}
void ImageGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
if (m_bIsPressed)
{
QPointF disPointF = event->pos() - m_lastPointF;
m_lastPointF = event->pos();
setSceneRect(sceneRect().x() - disPointF.x(),
sceneRect().y() - disPointF.y(),
sceneRect().width(),
sceneRect().height());
update();
}
QGraphicsView::mouseMoveEvent(event);
}
void ImageGraphicsView::mouseReleaseEvent(QMouseEvent *mouseEvent)
{
if (m_bIsPressed)
m_bIsPressed = false;
QGraphicsView::mouseReleaseEvent(mouseEvent);
}