QHeaderView 鼠标跟踪失败

QHeaderView mouse tracking fails

我需要将一些简单的过滤器功能连接到鼠标单击 QTreeView header 项目。很简单,我实现了一个连接到的槽函数:

QTreeView::header()->sectionClicked(int)

设置后

QTreeView::header()->setSectionsClickable(true)

,sectionClicked 每当我点击任何可点击的 header 都会产生的默认悬停效果突出显示的 header 时发出。

问题是,将鼠标悬停在可点击的 header 中的某些区域上将无法识别。因此,在这些部分中没有亮点,我不会得到任何 sectionClicked 触发器。我进一步追溯并从 QHeaderView 派生出我自己的 class 并将一些输出放入 mouseMoveEvent.

class MyHeaderView : public QHeaderView
{
    Q_OBJECT
public:
    MyHeaderView(QWidget* parent = 0)
        : QHeaderView(Qt::Horizontal, parent)
    {
        setMouseTracking(true);
    }
protected:
    virtual void mouseMoveEvent(QMouseEvent* event)
    {
        qDebug() << event->pos();
    }
};

在保留所有 QTreeView 设置的同时,我通过

将此 class 的一个实例设置为 header

QTreeView::setHeader(QHeaderView*)

我可以看到,所有区域的悬停效果都失败了,我没有得到您可以在覆盖的 mouseMoveEvent 中看到的调试输出。

因此我假设鼠标跟踪无法正常工作。

我正在处理的整个应用程序非常大,所以我为所有这些设置了一个独立的示例。令我惊讶的是,一切都按预期进行。我一无所知,我应该如何处理这个问题。谁能想到鼠标跟踪在小部件的某些部分失败的原因?这可能是与性能不足有关的帧速率问题吗?小部件上是否有影响整个鼠标跟踪区域的设置? parent 小部件可以影响鼠标跟踪吗?

在我的应用程序中,我有一个控制器 class,它处理许多连接到树视图发出的各种信号的应用程序逻辑。 class 不支持渲染任何可视化。因此,从 QObject 派生将是最合理的选择。过了一会儿我注意到,它实际上是从 QWidget 派生的。作为一个 QWidget,我猜它试图呈现某种视觉表示,它覆盖了树视图。这就是为什么我在页眉的某些部分没有收到任何鼠标事件。

将我的控制器的基础 class 更改为 QObject 后,一切正常。