QGraphicsView缩放举例

在Qt中,QGraphicsView是一个用于显示和交互QGraphicsScene的控件,它提供了丰富的功能来实现图形的缩放、旋转、平移等操作。下面是一个使用QGraphicsView实现缩放的示例:

基本步骤

  1. 创建视图框架

    • QGraphicsView:显示窗口。
    • QGraphicsScene:管理场景中的图形项。
    • QGraphicsItem:场景中的图形项,需要继承重写paint(绘制函数)和boundingRect(大小位置函数)这两个纯虚函数。
  2. QGraphicsView中添加QGraphicsScene

    • 使用QGraphicsViewsetScene方法将QGraphicsScene添加到视图中。
  3. 设置缩放功能

    • 使用QGraphicsViewsetTransformationAnchorsetTransform方法来设置视图的缩放行为。
    • setTransformationAnchor(QGraphicsView::AnchorUnderMouse):设置缩放锚点为鼠标位置,这样缩放会以鼠标所在点为中心。
    • setTransform(QTransform::fromScale(scaleValue, scaleValue)):通过变换矩阵QTransform实现缩放,scaleValue为缩放比例。
  4. 处理缩放事件

    • 重写QGraphicsViewwheelEvent方法来处理鼠标滚轮事件,从而实现滚轮缩放。
    • wheelEvent中,根据鼠标滚轮的滚动方向(正或负)来调整缩放比例,并调用setTransform方法应用缩放。

示例代码

#ifndef MGRAAPHICSVIEW_H
#define MGRAAPHICSVIEW_H

#include <QGraphicsView>
#include <QWheelEvent>

class MGraaphicsView : public QGraphicsView {
public:
    MGraaphicsView(QGraphicsScene *scene, QWidget *parent = nullptr);

protected:
    virtual void wheelEvent(QWheelEvent *event);

private:
    int m_zoom = 0;
    double m_zoomnum = 1;
};

#endif // MGRAAPHICSVIEW_H



#include "mgraaphicsview.h"
#include <qmath.h>
#include <QDebug>

MGraaphicsView::MGraaphicsView(QGraphicsScene *scene, QWidget *parent)
    : QGraphicsView(scene, parent) {
    setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
    setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
    setDragMode(QGraphicsView::ScrollHandDrag);
    setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
}

void MGraaphicsView::wheelEvent(QWheelEvent *event) {
    event->accept();

    QPoint angleDelta = event->angleDelta();
    int deltaY = angleDelta.y();

    // 根据滚轮的滚动方向调整缩放比例
    double scaleFactor = 1.15; // 缩放因子
    if (deltaY > 0) {
        m_zoom *= scaleFactor; // 增加缩放级别
    } else {
        m_zoom /= scaleFactor; // 减少缩放级别
    }
    double m_zoom2 = m_zoom;
    // 限制缩放级别的范围,例如:0.1 到 10 倍
    m_zoom = qBound(0.1, m_zoom2, 10.0);

    // 应用缩放变换
    setTransform(QTransform::fromScale(m_zoom, m_zoom));
}

#include <QApplication>
//#include "MGraaphicsView.h" // 包含你的自定义图形视图类的头文件

int main(int argc, char *argv[]) {
    QApplication app(argc, argv); // 创建应用程序对象

    // 创建场景(如果需要的话)
    QGraphicsScene *scene = new QGraphicsScene();

    // 向场景中添加一些图形项(可选)
    // scene->addEllipse(...);
    // scene->addLine(...);
    // ...

    // 创建你的自定义图形视图对象
    MGraaphicsView *view = new MGraaphicsView(scene);

    // 设置视图的一些属性(可选)
    view->setRenderHint(QPainter::Antialiasing);
    view->setFixedSize(800, 600); // 或者使用其他大小

    // 显示视图
    view->show();

    // 进入应用程序的事件循环
    return app.exec();
}

关键点解释

  • 缩放锚点:通过设置setTransformationAnchor(QGraphicsView::AnchorUnderMouse),确保缩放操作以鼠标当前位置为中心。
  • 缩放比例:通过调整m_zoom变量的值来控制缩放比例,并使用qPow(2, m_zoom)来计算实际的缩放因子。
  • 滚轮事件处理:在wheelEvent中,根据鼠标滚轮的滚动方向(event->delta()的正负)来增加或减少缩放级别。

这个示例展示了如何使用QGraphicsView实现基本的缩放功能。通过进一步定制和扩展,还可以实现更复杂的交互效果,如定点缩放、限制缩放范围等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值