gpt4 book ai didi

qt - QGraphicsView 和 eventFilter

转载 作者:行者123 更新时间:2023-12-04 02:08:43 25 4
gpt4 key购买 nike

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

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

当我将 MyFilter 对象作为事件过滤器安装到 MyGraphicsView 时,鼠标事件在传递到 MyGraphicsView 后传递到 MyFilter,而键事件在传递到 MyGraphicsView 之前传递到 MyFilter。

在第二种情况下,我将 MyFilter 对象作为事件过滤器安装到 MyGraphicsView->viewport() (这是标准 QGLWidget),鼠标事件在传递到 MyGraphicsView 之前传递到 MyFilter,而键事件仅传递到 MyGraphicsView .

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

提前致谢。
最好的祝福。

最佳答案

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

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

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

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

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

更改 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)


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);

关于qt - QGraphicsView 和 eventFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2445997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com