Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不是';我的Qt eventFilter无法拾取鼠标事件吗?_C++_Qt_Qtreewidget_Qt Events - Fatal编程技术网

C++ 为什么不是';我的Qt eventFilter无法拾取鼠标事件吗?

C++ 为什么不是';我的Qt eventFilter无法拾取鼠标事件吗?,c++,qt,qtreewidget,qt-events,C++,Qt,Qtreewidget,Qt Events,我基本上有这个代码来截获某些QTreeWidget事件 MyWidget :: MyWidget () { m_tree = new QTreeWidget (); // ... m_tree -> installEventFilter (this); } bool MyWidget :: eventFilter (QObject * obj, QEvent * e) { if (m_tree != obj) return QWidg

我基本上有这个代码来截获某些
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;
    };

    // ...
 }
MyWidget::MyWidget()
{
m_tree=newqtreewidget();
// ...
m_tree->installEventFilter(此);
}
bool MyWidget::eventFilter(QObject*obj,QEvent*e)
{
if(m_树!=obj)
返回QWidget::eventFilter(obj,e);
qDebug()类型();
开关(e->type())
{
案例QEvent::鼠标按钮按下:
案例QEvent::鼠标按钮释放:
案例QEvent::MouseMove:
案例QEvent::离开:
qDebug()type()
用于许多事件,但不用于鼠标事件。鼠标事件似乎永远不会发生(除了
离开


为什么会发生这种情况?如果至少有一个按钮被按下,我应该在鼠标跟踪关闭的情况下获取移动事件,并且不管怎样,我都应该获取按下和释放事件。
QTreeWidget
本身行为正常,就好像没有安装事件处理程序一样。

事件不会发生在QTreeView上,而是发生在视口上。改为在
QTreeView::viewport()
上安装视口。或者,重写
mousePressEvent
mouseReleaseEvent
等(因为所有这些都不需要QTreeView的事件筛选器)。很抱歉,我应该指定:鼠标单击事件不会发生在QTreeView上,而是发生在视口上。大多数其他事件都发生在QTreeView上。@AlexanderHuszagh详细说明:即使事件发生在视口上,
MousePresseEvent
和朋友在为
QTreeView
重写时也会捕获该事件,因为t已经在视口内部安装了一个事件过滤器(QAbstractScrollArea)。谢谢。想把它变成一个答案吗?当然,但我主要是用PySide(用于Qt的Python绑定)编写代码的,所以你介意代码是用Python/伪代码编写的吗?非常乐意提供帮助。