2010-09-16 221 views
1

问候所有,QT鼠标事件处理问题

如在图像

http://i51.tinypic.com/2r56s1j.jpg

看出我具有延长QWidget的对象(其绘制细胞的图像和一些countour数据)一个QScrollBar内部。 用户可以使用鼠标滚轮放大/缩小图像(QWidget大小根据QImage的缩放大小而改变)。

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

任何提示,

[编辑]抱歉,我指的QScrollArea,不QScrollBar。

感谢, umanga

+0

有两个问题。你的意思是QScrollArea而不是QScrollBar?你是否想要滚动条响应滚轮? – 2010-09-16 05:14:16

+0

对不起,是的,它的QScrollArea。是的,实际上我想使用滚动条来移动可见区域。 – 2010-09-16 05:16:17

回答

1

我不确定,如果你想滚轮曾经被用于缩放图像,或者如果你想滚轮来控制,当图像比滚动区域视小放大,然后使用滚动当图像大于滚动区视口时滚轮进行滚动。在任何一种情况下,您都应该能够自定义如何使用以下方式处理车轮:

由于我没有真正尝试过这个,我不确定它是否会起作用。希望如果您安装了事件过滤器并将事件设置为忽略,该事件仍将传播回您的图像小部件。这将允许您保留当前在图像小部件中的鼠标处理完好无损。

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 
} 

scrollAreaShouldHandleWheel标志,你会根据您是否希望滚动区域来处理滚轮事件设定从图像构件一个布尔值。

在代码中的某处,您将安装图像小部件作为scrollarea的事件过滤器。

scrollArea->installEventFilter(imageWidget); 

如果这不起作用,你可以随时使用这个过滤器,确保你的widget获取事件,并直接处理它,然后返回true,这样滚动区域将无法接收事件。

+0

阿诺德,非常感谢你的答案。我会试试这个。 – 2010-09-16 07:44:18

1

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

0

对于Qwidget,您是否完成了grabMouse(),即您显示图像的那个?

+0

是的,我试过了,如果我调用grabMouse(),其他控件没有响应。 – 2010-09-16 06:23:56

+0

你忽略了你在QScrollArea上收到的事件。我的意思是说事件 - >忽略() – Naruto 2010-09-16 09:25:03