想要将继承QGraphicsView的子类视图进行缩放需要重写下面的父类方法。
void wheelEvent(QWheelEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *mouseEvent) override;
double m_dOriScale;//视图的原始比例
构造函数中设置视图样式和开放必要属性功能
ImageGraphicsView::ImageGraphicsView()
{
m_dOriScale = 1;//图形原始比例
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏水平条
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏竖条
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);//以鼠标位置为缩放锚点
setDragMode(QGraphicsView::ScrollHandDrag);//默认手形拖动
}
void ImageGraphicsView::wheelEvent(QWheelEvent *event)
{
if ((event->angleDelta().y() > 0) && (m_dOriScale >= 50))//最大放大到原始图像的50倍
return;
else if ((event->angleDelta().y() < 0) && (m_dOriScale <= 0.01))//图像缩小到自适应大小之后就不继续缩小
return;
qreal scaleFactor = this->matrix().m11();
m_dOriScale = scaleFactor;
int wheelDeltaValue = event->angleDelta().y();
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)
{
QPointF point = mapToScene(event->pos());
if(!this->sceneRect().contains(point))
{
event->ignore();
return;
}
QGraphicsView::mousePressEvent(event);
}
void ImageGraphicsView::mouseReleaseEvent(QMouseEvent *mouseEvent)
{
QPointF point = mapToScene(event->pos());
if(!this->sceneRect().contains(point))
{
event->ignore();
return;
}
QGraphicsView::mouseReleaseEvent(event);
}