完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
那每次动滚轮时,需要根据你鼠标的坐标,以及放大/缩小的比例来计算出图片的位置坐标,然后重新赋予图片,这样应该就可以实现位置不变了。
|
|
1 条评论
|
|
Image ZoomSingle属性 lastmouse position给到image center position
|
|
|
|
您好,要实现像CAD一样的滚轮缩放,需要在代码中进行以下操作:
1. 获取鼠标滚轮的滚动方向和缩放倍数 在`QGraphicsView`中,可以通过重写`wheelEvent`方法获取鼠标滚轮的滚动方向和缩放倍数: ```cpp void GraphicsView::wheelEvent(QWheelEvent *event) { int delta = event->angleDelta().y(); double scaleFactor = 1.15; if (delta > 0) { // 滚轮向上,缩小 scale(1/scaleFactor, 1/scaleFactor); } else { // 滚轮向下,放大 scale(scaleFactor, scaleFactor); } event->accept(); } ``` 这里`scaleFactor`是缩放倍数,可以根据需要自行调整。 2. 让鼠标所在的点保持不变 默认情况下,`QGraphicsView`会以视图中心点为缩放基准点。为了实现像CAD一样的效果,需要让鼠标所在的点保持不变。 可以通过以下步骤实现: - 将鼠标所在点的坐标转换为场景坐标系 - 获取当前视图是以哪个点为中心点进行缩放的 - 计算出缩放后中心点的偏移量 - 将偏移量加回去,让鼠标所在点保持不变 代码如下: ```cpp void GraphicsView::wheelEvent(QWheelEvent *event) { // 获取鼠标所在点的场景坐标 QPointF scenePos = mapToScene(event->pos()); // 获取当前视图是以哪个点为中心点进行缩放的 QPointF oldCenter = mapToScene(viewport()->rect().center()); QPointF newCenter = oldCenter; // 计算出缩放后中心点的偏移量 int delta = event->angleDelta().y(); double scaleFactor = 1.15; if (delta > 0) { newCenter = (scenePos - oldCenter) * (1/scaleFactor) + oldCenter; scale(1/scaleFactor, 1/scaleFactor); } else { newCenter = (scenePos - oldCenter) * scaleFactor + oldCenter; scale(scaleFactor, scaleFactor); } // 将偏移量加回去,让鼠标所在点保持不变 QPointF deltaPos = scenePos - newCenter; horizontalScrollBar()->setValue(horizontalScrollBar()->value() + deltaPos.x()); verticalScrollBar()->setValue(verticalScrollBar()->value() + deltaPos.y()); event->accept(); } ``` 附件中的示例程序已经实现了以上功能,可以参考一下。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
809 浏览 1 评论
2349 浏览 2 评论
2074 浏览 4 评论
labview如何实现电机位置与图像清晰度计算值相对应,或者说如何实现电机每步距计算一次清晰度值?
2271 浏览 2 评论
2797 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-24 23:54 , Processed in 0.623026 second(s), Total 90, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191