首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGraphicsView和eventFilter

QGraphicsView和eventFilter
EN

Stack Overflow用户
提问于 2010-03-15 09:12:52
回答 2查看 6.9K关注 0票数 11

这件事已经困扰了我两天多了,所以我想我应该问问。我在Win7上使用QT4.5.3(用Win7编译)。

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

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

在第二个例子中,我将MyFilter对象作为一个事件过滤器安装到MyGraphicsView->viewport() (这是一个standart QGLWidget),鼠标事件在交付给MyGraphicsView之前被传递给MyFilter,而关键事件只传递给MyGraphicsView。

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

提前谢谢。诚挚的问候。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-23 16:01:56

QGraphicsView是QAbstractScrollArea的一个子类,是造成这些行为的原因。

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

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

代码语言:javascript
复制
w.viewport()->setFocusProxy(0);

另一种方法是在图形视图及其视口上安装事件筛选器,但是修改筛选器,使其只处理来自一个对象的关键事件和来自另一个对象的鼠标事件。

更改MyFilter.h

代码语言:javascript
复制
  QObject *keyObj;
  QObject *mouseObj;

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

改变MyFilter.cpp

代码语言:javascript
复制
MyFilter::MyFilter(QObject *keyObj, QObject *mouseObj, QObject *parent /*= NULL*/ ) : QObject(parent), keyObj(keyObj), mouseObj(mouseObj)

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
票数 13
EN

Stack Overflow用户

发布于 2010-03-19 08:19:38

不如不要使用过滤器,而是在MyGraphicsView上重新实现必要的MyGraphicsView处理程序,如下所示:

代码语言:javascript
复制
void MyGraphicsView::mousePressEvent(QMouseEvent* pe)
{
if (pe->buttons() & Qt::LeftButton)
{
    this->setCursor(Qt::CrossCursor);
    zoomOrigin = pe->pos();
    rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
    rubberBand->setGeometry(QRect(zoomOrigin, QSize(0,0)));
    rubberBand->show();
}
if (pe->buttons() & Qt::MidButton)
{
    panOrigin = pe->pos();
        this->setCursor(Qt::ClosedHandCursor);
}
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2445997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档