为什么我的 Qt eventFilter 没有拾取 QTreeWidget 上的鼠标事件?

问题描述 投票:0回答:1

我基本上有这段代码来拦截某些

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
本身表现正常,就好像没有安装事件处理程序一样。

c++ qt qtreewidget qmouseevent qt-events
1个回答
0
投票

鼠标事件似乎是由树视图上的视口处理的,因此您需要将事件过滤器安装在树视图的视口上,而不是树视图本身。

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;
    };

    // ...
 }
© www.soinside.com 2019 - 2024. All rights reserved.