这件事已经困扰了我两天多了,所以我想我应该问问。我在Win7上使用QT4.5.3(用Win7编译)。
我有MyGraphicsView (继承QGraphicsView)和MyFilter (继承QObject)类。
当我将MyFilter对象作为事件过滤器安装到MyGraphicsView时,鼠标事件在传递到MyGraphicsView之后被传递给MyFilter,而关键事件在传递到MyGraphicsView之前被传递给MyFilter。
在第二个例子中,我将MyFilter对象作为一个事件过滤器安装到MyGraphicsView->viewport() (这是一个standart QGLWidget),鼠标事件在交付给MyGraphicsView之前被传递给MyFilter,而关键事件只传递给MyGraphicsView。
事件应该在传递到实际对象之前传递到事件过滤器,那么为什么会发生这种情况呢?我该怎么做才能确保这份订单?
提前谢谢。诚挚的问候。
发布于 2010-03-23 16:01:56
QGraphicsView是QAbstractScrollArea的一个子类,是造成这些行为的原因。
在第一种情况下,QAbstractScrollArea在调用MyGraphicsView ()时将自身作为事件过滤器添加到setViewport中。QAbstractScrollArea的事件过滤器捕获鼠标事件,首先通过viewportEvent()发送它,然后发送到传播到MyGraphicsView鼠标事件处理程序的QWidget事件处理。只有在此之后才会完成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)和
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);发布于 2010-03-19 08:19:38
不如不要使用过滤器,而是在MyGraphicsView上重新实现必要的MyGraphicsView处理程序,如下所示:
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);
}
}https://stackoverflow.com/questions/2445997
复制相似问题