QT鼠标事件处理问题

时间:2010-09-16 01:06:14

标签: c++ qt event-handling qt4

问候所有人,

如图所示

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

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

我通过在QWidget中实现监听器方法来处理事件(mouseMoveEvent(),wheelEvent()等)。 我的问题是,当鼠标指针悬停在QWidget上时,我只能执行缩放(和其他事件)。 如果鼠标点位于QScrollBar(图像中的灰色区域)之上,则QScroolBar会消耗这些事件。

任何提示,

[编辑] 抱歉,我引用了QScrollArea,而不是QScrollBar。

感谢, umanga

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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);

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

答案 2 :(得分:0)

你为Qwidget做了grabMouse(),比如显示图片吗?