C++ QT鼠标事件处理问题

C++ QT鼠标事件处理问题,c++,qt,event-handling,qt4,C++,Qt,Event Handling,Qt4,大家好, 如图所示 我在QScrollBar中有一个扩展的QWidget对象(它绘制细胞图像和一些countour数据)。 用户可以使用鼠标滚轮放大/缩小图像(QWidget大小根据QImage的缩放大小更改) 我通过在QWidget中实现侦听器方法来处理事件(mouseMoveEvent()、wheelEvent()…等等)。 我的问题是,我只能在鼠标指针位于QWidget上时执行缩放(和其他事件)。 如果鼠标点位于QScrollBar(图像中的灰色区域)上,则QScrollBar将使用这些

大家好,

如图所示

我在QScrollBar中有一个扩展的QWidget对象(它绘制细胞图像和一些countour数据)。 用户可以使用鼠标滚轮放大/缩小图像(QWidget大小根据QImage的缩放大小更改)

我通过在QWidget中实现侦听器方法来处理事件(mouseMoveEvent()、wheelEvent()…等等)。 我的问题是,我只能在鼠标指针位于QWidget上时执行缩放(和其他事件)。 如果鼠标点位于QScrollBar(图像中的灰色区域)上,则QScrollBar将使用这些事件

任何提示

[编辑]对不起,我指的是QScrollArea,不是QScrollBar

谢谢,
umanga

我建议您使用Qgraphicscene和QGraphicsView。图形框架已经提供了许多有用的功能(包括视口转换)。QGraphicsView是一个滚动区域。

您是否完成了
抓取鼠标()
用于Qwidget,即用于显示图像的小部件?

我不确定您是否希望滚轮仅用于缩放图像,或者希望滚轮在图像小于滚动区域视口时控制缩放,然后在图像较大时使用滚轮进行滚动而不是滚动区域视口。无论是哪种情况,您都应该能够通过以下方式自定义控制盘的操作方式:

因为我还没有试过这个,所以我不确定它是否有效。希望是,如果您安装了一个事件过滤器并在事件上设置了ignore,该事件仍然会传播回您的图像小部件。这将允许您在图像小部件中保持当前鼠标操作不变

bool YourImageWidget::eventFilter(QObject *obj, QEvent *event)
{
    if((obj == scrollAreaPointer) && (event->type() == QEvent::Wheel))
    {
        if(!scrollAreaShouldHandleWheel)
        {
            event->ignore();
        }
    }
    return false; // always pass the event back to the scroll area
}
滚动区域shoulldhandlewheel
标志是一个布尔值,您可以根据是否希望滚动区域处理控制盘事件从图像小部件中设置

在代码的某个地方,您可以安装图像小部件作为scrollarea的事件过滤器

scrollArea->installEventFilter(imageWidget);

如果这不起作用,您可以始终使用此筛选器确保您的小部件获取事件并直接处理它,然后返回true,这样滚动区域将无法接收事件。

两个问题。你是说QScrollara而不是QScrollBar?你想让滚动条响应滚轮吗?对不起,是的,这是QScrollArea。是的,实际上我想使用滚动条移动可见区域。是的,我尝试过,如果我调用grabMouse()其他控件没有响应。是否忽略在QScrollara接收到的事件。我的意思是说事件->忽略()