视图的缩放:
对视图进行缩放,主要是重写wheelEvent事件
void Myview::wheelEvent(QWheelEvent *event)//重写滚轮事件
{
qreal factor_out = transform().scale(1.2, 1.2).mapRect(QRectF(0,0,1,1)).width();
qreal factor_in=transform().scale(1/1.2,1/1.2).mapRect(QRectF(0,0,1,1)).width();
if(event->delta()>0){
if(factor_out>70) return;//防止视图过大
scale(1.2,1.2);//放大
}
else if(event->delta()<0){
if(factor_in<0.1)return;//防止视图过小
scale(1/1.2,1/1.2);//缩小
}
}
为了改善缩放效果,以鼠标为中心进行缩放,则需要添加以下代码:
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
视图的平移:
实现视图的平移要比缩放复杂一些,需要重写三个鼠标事件:mousePressEvent、mouseMoveEvent、mouseReleaseEvent。
大概过程如下:(1)按下:鼠标左键->改变光标、触发平移信号(bool值为真)->记录鼠标按下的初始坐标
(2)移动:接收到平移信号->计算移动距离->记录鼠标最后的坐标(作为下一次平移的起点坐标)
(3)释放:恢复之前平移信号和光标形状
void Myview::mousePressEvent(QMouseEvent *event)
{
if (event->button() == translateButton) {
//若按下左键
QCursor cursor1;//创建光标对象
cursor1.setShape(Qt::OpenHandCursor);//设置光标形态为手掌
setCursor(cursor1); //使用手掌光标
//qDebug()<<mapToScene(event->pos());
sign = true;//触发平移信号
lastPos = event->pos();
}
QGraphicsView::mousePressEvent(event);
}
void Myview::mouseMoveEvent(QMouseEvent *event)
{
if (sign==true){
QPointF mouseDelta = event->pos() - lastPos;
translate(mouseDelta);
}
lastPos = event->pos();
QGraphicsView::mouseMoveEvent(event);
}
void Myview::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == translateButton)
sign = false;
setCursor(cursor); //拖动完成后,光标恢复默认形状
QGraphicsView::mouseReleaseEvent(event);
}
// 平移
void Myview::translate(QPointF delta)
{
delta *= translateSpeed;
// view 根据鼠标下的点作为锚点来定位 scene
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
QPoint newCenter(VIEW_WIDTH/2-delta.x(),VIEW_HEIGHT/2-delta.y());
centerOn(mapToScene(newCenter));
// scene 在 view 的中心点作为锚点
setTransformationAnchor(QGraphicsView::AnchorViewCenter);
}
视图的翻转(Y轴):
之前写的代码是对图元的翻转,其本身坐标发生了改变,为了改善这个问题,可以对整个视图进行翻转,从而保证图元坐标不发生变化。
QTransform transform;
transform.rotate(180,Qt::XAxis);//视图绕x轴旋转180度
view->setTransform(transform);