的QGraphicsView是QAbstractScrollArea的子類,是這些行爲的原因。
在第一種情況下,當調用setViewport()時,QAbstractScrollArea將其自身作爲事件過濾器添加到MyGraphicsView。 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);
由於ordet似乎是這個問題,可能是你的代碼片段將是有用的。 – gregseth 2010-03-19 07:55:56
好男人,這裏是鏈接到最小的代碼,再現問題。 http://rapidshare.com/files/363574158/QGVEF.rar – erelender 2010-03-22 07:25:28