放大/缩小鼠标点? [英] Zooming in/out on a mouser point ?

查看:20
本文介绍了放大/缩小鼠标点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如图所示。

我在QScrollArea中有QWidget。 QWidget作为细胞图像和一些基于矢量的轮廓数据的渲染小部件。 用户可以进行放大和缩小,简单的情况是,它会相应地更改QPaint的比例和QWidget的大小。

现在我想对鼠标下方的点执行放大/缩小。(类似于GIMP中的缩放操作)。 如何根据缩放级别计算滚动条的新位置? 使用转换而不使用Scrolarea实现此操作是否更好?

推荐答案

一种解决方案可以是从QScrollArea派生一个新类,然后重新实现wheelEvent,以便使用鼠标滚轮在当前鼠标光标位置执行缩放。

此方法通过相应调整滚动条位置来反映新的缩放级别。这意味着只要没有可见的滚动条,就不会在鼠标光标位置下进行缩放。这是大多数图像查看器应用程序的行为。

void wheelEvent(QWheelEvent* e) {
    double OldScale = ... // Get old scale factor
    double NewScale = ... // Set new scale, use QWheelEvent...

    QPointF ScrollbarPos = QPointF(horizontalScrollBar()->value(), verticalScrollBar()->value());
    QPointF DeltaToPos = e->posF() / OldScale - widget()->pos() / OldScale;
    QPointF Delta = DeltaToPos * NewScale - DeltaToPos * OldScale;

    widget()->resize(/* Resize according to new scale factor */);

    horizontalScrollBar()->setValue(ScrollbarPos.x() + Delta.x());
    verticalScrollBar()->setValue(ScrollbarPos.y() + Delta.y());
}

这篇关于放大/缩小鼠标点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆