c++ qt qgraphicsview
我有一个在屏幕中间的QGraphicsView窗口的应用程序。我想能够放大和车轮滚动。 目前,我有重新的QGraphicsView和重写的滚动函数,让是doesnt滚动图像(像它在默认情况下)。

void MyQGraphicsView::wheelEvent(QWheelEvent *event)
{if(event->delta() > 0){emit mouseWheelZoom(true);}else{emit mouseWheelZoom(false);}
}

所以,当我滚动IMlaunch的信号是当轮着假,如果回轮。 我曾那么这个信号连接到一个槽(变焦函数见下文)在处理我的GUI的东西类。现在基本上我觉得我的变焦函数只是心不是这样做的重写wheelevent函数的所有IV看到的例子来设置秤的最佳方式,但我不可能真正找到答案。 所以不是我有这么即时寻找这个做到了这一点,但它的不完美被扭捏了一下 CodeGo.net,或在滚轮事件函数的工作规模。 í初始化 m_zoom_level0 在构造函数中。

void Display::zoomfunction(bool zoom)
{QMatrix matrix;if(zoom && m_zoom_level < 500){m_zoom_level = m_zoom_level + 10;ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);matrix.scale(m_zoom_level, m_zoom_level);ui->graphicsView->setMatrix(matrix);ui->graphicsView->scale(1,-1);}else if(!zoom){m_zoom_level = m_zoom_level - 10;ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);matrix.scale(m_zoom_level, m_zoom_level);ui->graphicsView->setMatrix(matrix);ui->graphicsView->scale(1,-1);}
}

正如你可以看到上面有QMatrix和标定,并设置为Graphicsview和转换锚点设置下,但它只是不工作完美,如果IM滚动加载它只是开始放大只(我认为这是做的诠释循环或以上 正如我所说的帮助,这还是规模下一个很好的例子将是巨大的感谢
本文地址 :CodeGo.net/8897373/ 
------------------------------------------------------------------------------------------------------------------------- 
1. 这种缩放是有点棘手。分享我自己的类做的。 包头:

#include <QObject>
#include <QGraphicsView>
/*!* This class adds ability to zoom QGraphicsView using mouse wheel. The point under cursor* remains motionless while it's possible.** Note that it becomes not possible when the scene's* size is not large enough comparing to the viewport size. QGraphicsView centers the picture* when it's smaller than the view. And QGraphicsView's scrolls boundaries don't allow to* put any picture point at any viewport position.** When the user starts scrolling, this class remembers original scene position and* keeps it until scrolling is completed. It's better than getting original scene position at* each scrolling step because that approach leads to position errors due to before-mentioned* positioning restrictions.** When zommed using scroll, this class emits zoomed() signal.** Usage:** new Graphics_view_zoom(view);** The object will be deleted automatically when the view is deleted.** You can set keyboard modifiers used for zooming using set_modified(). Zooming will be* performed only on exact match of modifiers combination. The default modifier is Ctrl.** You can change zoom velocity by calling set_zoom_factor_base().* Zoom coefficient is calculated as zoom_factor_base^angle_delta* (see QWheelEvent::angleDelta).* The default zoom factor base is 1.0015.*/
class Graphics_view_zoom : public QObject {Q_OBJECT
public:Graphics_view_zoom(QGraphicsView* view);void gentle_zoom(double factor);void set_modifiers(Qt::KeyboardModifiers modifiers);void set_zoom_factor_base(double value);
private:QGraphicsView* _view;Qt::KeyboardModifiers _modifiers;double _zoom_factor_base;QPointF target_scene_pos, target_viewport_pos;bool eventFilter(QObject* object, QEvent* event);
signals:void zoomed();
};

来源:

#include "Graphics_view_zoom.h"
#include <QMouseEvent>
#include <QApplication>
#include <QScrollBar>
#include <qmath.h>
Graphics_view_zoom::Graphics_view_zoom(QGraphicsView* view): QObject(view), _view(view)
{_view->viewport()->installEventFilter(this);_view->setMouseTracking(true);_modifiers = Qt::ControlModifier;_zoom_factor_base = 1.0015;
}
void Graphics_view_zoom::gentle_zoom(double factor) {_view->scale(factor, factor);_view->centerOn(target_scene_pos);QPointF delta_viewport_pos = target_viewport_pos - QPointF(_view->viewport()->width() / 2.0,_view->viewport()->height() / 2.0);QPointF viewport_center = _view->mapFromScene(target_scene_pos) - delta_viewport_pos;_view->centerOn(_view->mapToScene(viewport_center.toPoint()));emit zoomed();
}
void Graphics_view_zoom::set_modifiers(Qt::KeyboardModifiers modifiers) {_modifiers = modifiers;
}
void Graphics_view_zoom::set_zoom_factor_base(double value) {_zoom_factor_base = value;
}
bool Graphics_view_zoom::eventFilter(QObject *object, QEvent *event) {if (event->type() == QEvent::MouseMove) {QMouseEvent* mouse_event = static_cast<QMouseEvent*>(event);QPointF delta = target_viewport_pos - mouse_event->pos();if (qAbs(delta.x()) > 5 || qAbs(delta.y()) > 5) {target_viewport_pos = mouse_event->pos();target_scene_pos = _view->mapToScene(mouse_event->pos());}} else if (event->type() == QEvent::Wheel) {QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);if (QApplication::keyboardModifiers() == _modifiers) {if (wheel_event->orientation() == Qt::Vertical) {double angle = wheel_event->angleDelta().y();double factor = qPow(_zoom_factor_base, angle);gentle_zoom(factor);return true;}}}Q_UNUSED(object)return false;
}

用法示例:

Graphics_view_zoom* z = new Graphics_view_zoom(ui->graphicsView);
z->set_modifiers(Qt::NoModifier);

2.  经过一番这似乎工作。这个问题似乎是,该 QGraphicsViewtransform 无关,其滚动的位置,所以行为 QGraphicsView::mapToScene(const QPoint&) const 依赖于两个涡旋盘的位置和变换。我看源代码 mapToScene 要明白这一点。 考虑到这一点,这里有什么工作:现场点的指向,缩放,地图的场景点的坐标 CodeGo.net,然后将滚动条,使该点风下

void ZoomGraphicsView::wheelEvent(QWheelEvent* event)
{const QPointF p0scene = mapToScene(event->pos());qreal factor = std::pow(1.01, event->delta());scale(factor, factor);const QPointF p1mouse = mapFromScene(p0scene);const QPointF move = p1mouse - event->pos(); // The movehorizontalScrollBar()->setValue(move.x() + horizontalScrollBar()->value());verticalScrollBar()->setValue(move.y() + verticalScrollBar()->value());
}

3.  这是一个有点晚 但我走过的今天,只有用Pyside,但应该是 这种方法是“非常简单”,altough位 首先将所有锚NoAnchor,然后采取wheelevent点,其映射到现场, 翻译现场由这个值,规模,最后转换回:

def wheelEvent(self, evt):#Remove possible Anchorsself.widget.setTransformationAnchor(QtGui.QGraphicsView.NoAnchor)self.widget.setResizeAnchor(QtGui.QGraphicsView.NoAnchor)#Get Scene Postarget_viewport_pos = self.widget.mapToScene(evt.pos())#Translate Sceneself.widget.translate(target_viewport_pos.x(),target_viewport_pos.y())# ZOOMif evt.delta() > 0:self._eventHandler.zoom_ctrl(1.2)else:self._eventHandler.zoom_ctrl(0.83333)# Translate backself.widget.translate(-target_viewport_pos.x(),-target_viewport_pos.y())这是工作了我的目的,唯一的解决办法。
恕我直言,这也是最符合逻辑的解决方案...4.
这给出了在最佳的一个非常经验,并且应该避免。有一个很好的理由,为什么它不是Qt提供一个默认的行为。没关系,你不会有任何人的人机界面指南-您的应用程序不会使其进入Mac App Store的,亦不会为Windows应用商店。就个人而言,我会打电话给你的应用程序中断。当人们想放大,它们具有输入,做到这一点的输入装置。在触控板和触摸屏,捏的手势是有你,和Qt不支持它。在小鼠中,您可能需要一个独立的变焦轮,或至少一个修饰键。即使是这样,我不觉得这是一个好主意,因为你遇到了“有趣”的一角情况下,当调节剂被释放,但驱动程序或操作系统生成惯性运动的滚轮。你至少需要禁用惯性您的应用程序。到目前为止,我知道怎么做了OS X上,但我不知道如何将一个做到这一点在Windows上。如果任何人有掐输入的输入设备,应用程序将打破。你是不是处理双指缩放,从触摸屏(认为微软表面Pro或其他可转换债券)或触控板。您也将滚动投入缩放输入。你觉得这有什么意义可言了每一寸其他应用重新定义很可能你的平台(除了谷歌地图)上运行。顶多这应该是一个可选的解决方法的人太便宜,以获得更好,应该在默认情况下处于关闭状态。总体来说,我还没有看到任何人它正确,它真的不能正确完成。在正确的位是超重要。让我们来谈谈日常恐怖预告:谷歌地图。所以,要滚动地图,你不断地结束了放大,然后等待愚蠢的事情来重新加载等,这是一个扎实坏主意,因为滚轮/触控板的一切,但不幸的谷歌地图左右滚动。他们也有过缩放滚轮无法控制,所以对小鼠/触控板,它的行为合理,别人只是吹起来,以最大或最小缩放级别如此之快没有办法来控制它。他们在想什么。并非所有的流行的是什么好。注意:对于一个给定平台的人机界面指南是有原因的。即使你不打算发布您的产品到应用商店,你会迷失方向由逆着人流那里。这是糟糕的设计。我还是恳请你不要做。你可能不关心应用程序商店,但你不关心为好。让我们不要忘记,有横向和纵向滚轮事件。这将是你放大垂直滚轮运动起来,而是让通过横向的事件,他们会妥善任何滚动QAbstractScrollAreaQGraphicsView。哦,你确定你是妥善处理或禁用滚轮惯性?本文标题 :的QGraphicsView放大和缩小下鼠标位置使用鼠标滚轮本文地址 :CodeGo.net/8897373/ 

QGraphicsView放大和缩小下鼠标位置使用鼠标滚轮相关推荐

  1. js 获取鼠标在画布的位置_JS获取鼠标位置(鼠标坐标)

    在 JavaScript 中,当事件发生时,获取鼠标的位置是件很重要的事件.由于浏览器的不兼容性,不同浏览器分别在各自事件对象中定义了不同的属性,说明如下表所示.这些属性都是以像素值定义了鼠标指针的坐 ...

  2. C++获取鼠标位置,移动鼠标

    获取鼠标位置: 函数原型: WINUSERAPI BOOL WINAPI GetCursorPos(__out LPPOINT lpPoint);WINUSERAPI BOOL WINAPI GetP ...

  3. C#获取鼠标位置,模拟鼠标,模拟键盘(多方转载)

    c#获取鼠标坐标 很多时候我们需要用到鼠标在相对于窗体上的坐标,或者相对于屏幕的坐标,这里就把我的经验记录下. 用Control.MousePosition获得当前鼠标的坐标CurrentPoint, ...

  4. 【Qt+FFmpeg】鼠标滚轮放大、缩小、移动——解码播放本地视频(三)

    上一期我们实现了播放.暂停.重播.倍速功能,这期来谈谈如何实现鼠标滚轮放大缩小和移动:如果还没看过上期,请移步 [Qt+FFmpeg]解码播放本地视频(一)_logani的博客-CSDN博客[Qt+F ...

  5. 鼠标位置精确定位总结

    鼠标位置 序号 鼠标位置属性 属性描述 浏览器支持情况 备注 IE Chrome Safari  Firefox Opera 1 event.x 以浏览器窗口可见部分的左上角为坐标原点(不含滚动条) ...

  6. 手势放大、缩小和移动图片

    我写博客一般都是把在项目中遇到的一些问题记录下来,可以在以后遇到类似问题或者有新的思路时来回顾. 前两天就遇到一个需求:在手机端,把html页面的图片内容放大和缩小.移动位置.花了我一天时间才做好,本 ...

  7. QT中鼠标位置获取问题之event-globalPos()与pos()函数

    QT中鼠标位置获取问题之event->globalPos()与pos()函数 标签: Qt 2015-01-03 19:41 820人阅读 评论(0) 收藏 举报 分类: Qt 版权声明:本文为 ...

  8. 使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理。距离远时图片放大,距离近时图片缩小

    查看本章节 查看作业目录 需求说明: 使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理.距离远时图片放大,距离近 ...

  9. 以鼠标位置为中心的图片滚动放大缩小

    1 //以鼠标位置为中心的图片滚动放大缩小 2 $(document).on("mousewheel","#mask img",function(ev){ 3 ...

最新文章

  1. RabbitMQ消息队列-Centos7下安装RabbitMQ3.6.1
  2. MaxCompute - ODPS重装上阵 第五弹 - SELECT TRANSFORM
  3. Linux系统编程32:进程信号之详解信号集操作函数(sigset_t ,sigpending,sigprocmask)
  4. Ptrace 一个Linux强大的工具
  5. allatori混淆工具_Java 代码混淆工具 Allatori
  6. 3dmax渲染完就卡住不动,怎么办
  7. Excel实现行列转换的三种方式
  8. 斯阔谷冬奥会首次使用计算机,中国与冬奥会首次接触在美国加州,举办地以印第安女人命名...
  9. java min函数_Java Math min()用法及代码示例
  10. 【爬虫】【原创】08 使用简单正则表达式爬取下厨房(早餐,午餐,晚餐)
  11. 基于融云的即时通讯开发(一)
  12. 畅邮(DM Pro)-一款强悍、纯净而稳定的重量级电子邮箱客户端(支持分发、追踪)...
  13. .Snowflake Snow Snowflakes——解题报告
  14. Echarts桑基图sankey点击高亮显示
  15. 超详细 PHP 开发环境配置:WampServer+ZendStudio+XDebug
  16. 统信 UOS 连接 Windows 共享打印机
  17. win10 redis集群搭建 ruby
  18. python中@用法详解
  19. 管理费用负数报不了怎么办_管理费用发生额是负数怎么办
  20. 哥廷根大学提出CLIPSeg,能同时作三个分割任务的模型

热门文章

  1. 李永乐复习全书概率论与数理统计 第七、八章 参数估计及假设检验
  2. 与App Store审核的斗智斗勇
  3. mybatis与ibatis区别
  4. 如何确定去耦电容的大小?
  5. w32time 启动 错误2:系统找不到指定文件
  6. java泡泡堂分析_java泡泡堂 - WEB源码|JSP源码/Java|源代码 - 源码中国
  7. css animation 如何动态循环一组动画(多个动画组成)
  8. 西瓜书+南瓜书学习(1-2章)
  9. Web图片在线压缩优化工具
  10. 【Android安全】vdex、odex文件