QGraphicsView中鼠标位置图像缩放时不变

设置QGraphicsView的变换锚和调整尺寸锚到鼠标下面的操作,是一个很常见的模式,尤其在实现图形视图的缩放和滚动功能时。这两行代码的作用是提高用户与图形界面交互的直观性和效率。

  1. setTransformationAnchor(QGraphicsView::AnchorUnderMouse):这行代码设置了当你通过变换(例如缩放)QGraphicsView时,变换的中心点应该是当前鼠标所在的位置。这意味着,如果用户正将鼠标指针悬停在视图的某个点上并进行缩放操作,那么这个点将保持在鼠标指针下方,视图其他部分将围绕这个点进行缩放。这种方式使得用户可以非常精确地控制想要仔细查看的部分。

  2. setResizeAnchor(QGraphicsView::AnchorUnderMouse):这行代码设置了当视图窗口大小发生变化(即调整尺寸时),应该保持鼠标下面的图形项位置不变。这样,用户调整视图窗口大小时,可以更方便地继续之前的查看或编辑操作,而不需要重新定位到特定的区域。

举个例子,想象你正在使用一个图形编辑软件查看一个很大的设计图。你把鼠标指针放在图中你感兴趣的细节上,并使用滚轮进行缩放,希望只查看这个部分的细节。如果没有设置AnchorUnderMouse,那么缩放时你可能会发现视图偏离了你希望仔细查看的区域。同样,在调整窗口大小时,如果视图内容相对于窗口的位置发生了改变,这可能会中断你的工作流,因为你需要重新找到那个特定的区域。使用了AnchorUnderMouse后,这些操作会更加便捷和直观。

  //安装view事件到当前父对象
    ui->graphicsView->viewport()->installEventFilter(this);

    ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
    ui->graphicsView->setResizeAnchor(QGraphicsView::AnchorUnderMouse);

bool ImageGrab::eventFilter(QObject* obj, QEvent* event)
{
    if (obj== ui->graphicsView->viewport())
    {
        //尺寸变化时
        if (event->type() == QEvent::Resize) {
            
            //qInfo() << ui->graphicsView->viewport()->size();
            m_ViewSize = ui->graphicsView->viewport()->size();
            
            //m_pGraphicsScene->setSceneRect(0,0, m_ViewSize.width(), m_ViewSize.height());
            ui->graphicsView->fitInView(m_pGraphicsScene->sceneRect(), Qt::KeepAspectRatio);
            m_dMinImageRatio = ui->graphicsView->transform().m11();
            m_dImageRatio = m_dMinImageRatio;
            return true;
        }
        //鼠标滚轮滚动时,将场景进行缩放
        else if (event->type() == QEvent::Wheel)
        {
            QWheelEvent* wheelEvent = (QWheelEvent*)event;
            int wheelDeltaValue = wheelEvent->angleDelta().y();

            if ((wheelDeltaValue<0&&m_dImageRatio<= m_dMinImageRatio) || 
                (wheelDeltaValue>0 && m_dImageRatio>= m_dMaxImageRatio))
            {
                return true;
            }

            if (wheelDeltaValue>0)
            {
                ui->graphicsView->scale(1.2, 1.2);
            }
            else
            {
                ui->graphicsView->scale(1/1.2, 1/1.2);
            }

            // 当前放缩倍数;
            m_dImageRatio = ui->graphicsView->transform().m11();

            return true;
        }
        //else if (event->type() == QEvent::MouseButtonPress)
      

    }

原来QGraphicsView对于CAD中图元放大缩小早就有了现成的实现。再配合滚轮事件,放大缩小就没啥大问题了。

相关推荐

  1. QGraphicsView鼠标位置图像

    2024-05-26 00:48:55       11 阅读
  2. 高德map点标记随zoom位置

    2024-05-26 00:48:55       41 阅读
  3. 高德地图 鼠标移入infowindow取消地图滚轮

    2024-05-26 00:48:55       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-26 00:48:55       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-26 00:48:55       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-26 00:48:55       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-26 00:48:55       18 阅读

热门阅读

  1. 【Spark】加大hive表在HDFS存的每个文件的大小

    2024-05-26 00:48:55       9 阅读
  2. Python案例题目,入门小白题

    2024-05-26 00:48:55       11 阅读
  3. HTML5 Canvas图形绘制技术应用

    2024-05-26 00:48:55       8 阅读
  4. 链表相交-力扣

    2024-05-26 00:48:55       10 阅读
  5. RabbitMQ01-liunx下安装及用户权限分配

    2024-05-26 00:48:55       8 阅读
  6. 物联网系统

    2024-05-26 00:48:55       9 阅读
  7. Python库之`lxml`的高级用法深度解析

    2024-05-26 00:48:55       14 阅读