我基本上有这段代码来拦截某些
QTreeWidget
事件。
MyWidget :: MyWidget ()
{
m_tree = new QTreeWidget ();
// ...
m_tree -> installEventFilter (this);
}
bool MyWidget :: eventFilter (QObject * obj, QEvent * e)
{
if (m_tree != obj)
return QWidget :: eventFilter (obj, e);
qDebug () << e -> type ();
switch (e -> type ())
{
case QEvent :: MouseButtonPress:
case QEvent :: MouseButtonRelease:
case QEvent :: MouseMove:
case QEvent :: Leave:
qDebug () << "GOT EM";
break;
};
// ...
}
当我在
QTreeWidget
中单击并移动时,事件处理程序会打印出 e->type()
的许多事件,但不打印鼠标事件。鼠标事件似乎永远不会发生(Leave
除外)。
为什么会发生这种情况?即使鼠标跟踪关闭,只要至少按下一个按钮,我也应该收到移动事件,并且无论如何我都应该收到按下和释放事件。
QTreeWidget
本身表现正常,就好像没有安装事件处理程序一样。
鼠标事件似乎是由树视图上的视口处理的,因此您需要将事件过滤器安装在树视图的视口上,而不是树视图本身。
MyWidget :: MyWidget ()
{
m_tree = new QTreeWidget ();
// ...
m_tree -> viewport() -> installEventFilter (this);
}
bool MyWidget :: eventFilter (QObject * obj, QEvent * e)
{
if (m_tree -> viewport() != obj)
return QWidget :: eventFilter (obj, e);
qDebug () << e -> type ();
switch (e -> type ())
{
case QEvent :: MouseButtonPress:
case QEvent :: MouseButtonRelease:
case QEvent :: MouseMove:
case QEvent :: Leave:
qDebug () << "GOT EM";
break;
};
// ...
}