QGraphicsView 和 eventFilter

2024-05-10

这个问题已经困扰我两天多了,所以我想我应该问一下。我在Win7上使用Qt 4.5.3(用VC2008编译)。

我有 MyGraphicsView (继承 QGraphicsView)和 MyFilter (继承 QObject)类。

当我将 MyFilter 对象作为事件过滤器安装到 MyGraphicsView 时,鼠标事件将传递到 MyFilterafter它们被传递到 MyGraphicsView,而 Key 事件被传递到 MyFilterbefore它们被传送到 MyGraphicsView。

在第二种情况下,我将 MyFilter 对象作为事件过滤器安装到 MyGraphicsView->viewport() (这是一个标准的 QGLWidget),鼠标事件被传递到 MyFilterbefore它们被传递到 MyGraphicsView,而 Key 事件被传递到only我的图形视图。

事件应该在传递给实际对象之前传递给事件过滤器,那么为什么会发生这种情况呢?我应该怎么做才能确保这个订单?

提前致谢。 此致。


QGraphicsView 是 QAbstractScrollArea 的子类,它是这些行为的原因。

在第一种情况下,当调用 setViewport() 时,QAbstractScrollArea 将自身作为事件过滤器添加到 MyGraphicsView。 QAbstractScrollArea 的事件过滤器捕获鼠标事件,首先通过 viewportEvent() 将其发送,然后发送到 QWidget 事件处理,该事件处理传播到 MyGraphicsView 鼠标事件处理程序。只有在此之后,QAbstractScrollArea 的事件过滤器才会完成并且 MyFilter 才会开始运行。

在第二种情况下,关键事件仅传递到 MyGraphicsView,因为在 setViewport() 中 QAbstractScrollArea 将自身设置为焦点代理。如果使用以下代码重置焦点代理,则将传递按键事件。

w.viewport()->setFocusProxy(0);

另一种方法是在图形视图及其视口上安装事件过滤器,但将过滤器修改为仅处理来自一个对象的按键事件和来自另一个对象的鼠标事件。

更改 MyFilter.h

  QObject *keyObj;
  QObject *mouseObj;

public:
  MyFilter(QObject *keyObj, QObject *mouseObj, QObject *parent = NULL);

更改MyFilter.cpp

MyFilter::MyFilter(QObject *keyObj, QObject *mouseObj, QObject *parent /*= NULL*/ ) : QObject(parent), keyObj(keyObj), mouseObj(mouseObj)

and

if (obj == keyObj && e->type() == QEvent::KeyPress)
{
    qDebug()<<"Key Event recieved by MyFilter";
}
else if (obj == mouseObj && e->type() == QEvent::MouseButtonPress)
{
    qDebug()<<"Mouse Event recieved by MyFilter";
}

更改main.cpp

MyFilter *filter = new MyFilter(&w, w.viewport(), &w);

// Use this line to install to the viewport
w.viewport()->installEventFilter(filter);

//Use this line to install to MyGraphicsView
w.installEventFilter(filter);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QGraphicsView 和 eventFilter 的相关文章

随机推荐