spr*_*aff 5 c++ qt qtreewidget qt-events qmouseevent
我基本上有这段代码来拦截某些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;
};
// ...
}
Run Code Online (Sandbox Code Playgroud)
当我单击并在 中移动时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;
};
// ...
}
Run Code Online (Sandbox Code Playgroud)