QTableView 事件过滤器未检测到某些鼠标事件

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

我为 TableView 安装了自定义事件过滤器:

ui->groupBox->getView()->installEventFilter(mEventHandler.get());

这里是(部分)eventFilter 实现:

bool EventHandler::eventFilter(QObject *watched, QEvent *event)
{
    if (event->type() == QEvent::ToolTip)
    {
        return handleTooltipEvent(watched, event);
    }
    else if (event->type() == QEvent::MouseButtonPress)
    {
        return handleMouseClickEvent(watched, event);
    }
    ...

}

但是 MouseEvents 永远不会到达 eventFilter。我进行了一步一步的调试,所有类型的事件都通过这里,但没有鼠标相关事件。当我点击时,到达这里的事件是

QEvent::InputMethodQuery
事件。

相反,如果我重写表视图的 mousePressEvent() 函数,事件会到达那里:

void CustomTableView::mousePressEvent(QMouseEvent *event)
{
    auto proxyModel = dynamic_cast<QSortFilterProxyModel*>(model());
    if (proxyModel)
    {
       ...
    }
    QAbstractItemView::mousePressEvent(event);
}

Qt 官方文档 没有说明事件过滤器机制对 MouseEvents 的任何限制/排除。

我错过了什么?有人可以解释为什么 MouseEvents 没有到达 eventFilter() 方法吗?

我可以实现我想要覆盖的东西

QTableView::mousePressEvent()
,但这不是我的首选解决方案,我想了解是什么导致了这种行为。

c++ qt events qtableview
2个回答
3
投票

尝试将事件过滤器安装到表视图的

viewport()
.

ui->groupBox->getView()->viewport()->installEventFilter(mEventHandler.get());

1
投票

我错过了什么?有人可以解释为什么 MouseEvents 没有到达 eventFilter() 方法吗?

这里有一个解释:

QTableView
继承了
QAbstractScrollArea
,所以它就像2个小部件合二为一,容器和
viewport
.

默认情况下,

viewport
覆盖了整个容器,鼠标无法访问,这里是我将
viewport
的背景设置为蓝色的演示,并且没有修改
QTableWidget

由此可以看出为什么安装在

QTableWidget
上的事件过滤器没有注册鼠标按下事件。

如果你挤压

viewport
(我通过设置小于
QTableWidget
尺寸的最大尺寸来做到这一点),这样它就不会覆盖整个容器,事件过滤器将在
QTableWidget
上注册鼠标按下事件,因为现在它是
accesible
,并且正在被点击。外观如下:

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