QHeaderView鼠标跟踪失败

时间:2016-01-19 19:54:57

标签: qt mousemove qheaderview qmouseevent

我需要连接一些简单的过滤功能,鼠标点击QTreeView标题项。很简单,我实现了一个连接到:

的插槽函数

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

设置

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

,每当我点击由任何可点击标题将产生的默认悬停效果突出显示的标题时,就会发出sectionClicked

问题是,将无法识别悬停在可点击标题中的某些区域。因此,在这些部分中没有突出显示,我将不会获得任何sectionClicked触发器。我进一步追溯了它并从QHeaderView派生了我自己的类,并将一些输出放入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设置的同时,我通过

将此类的实例设置为标题

QTreeView::setHeader(QHeaderView*)

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

结果我假设,鼠标跟踪无法正常工作。

我正在开发的整个应用程序非常安静,所以我为所有这些设置了一个独立的例子。令我惊讶的是,一切都按预期工作。我很无能,我该如何处理这个问题。任何人都可以想到鼠标跟踪在窗口小部件的某些部分失败的原因吗?这可能是因缺乏性能而导致的帧率问题吗?小部件上是否存在影响整个鼠标跟踪区域的设置?父窗口小部件是否会影响鼠标跟踪?

1 个答案:

答案 0 :(得分:0)

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

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