我为 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()
,但这不是我的首选解决方案,我想了解是什么导致了这种行为。
尝试将事件过滤器安装到表视图的
viewport()
.
ui->groupBox->getView()->viewport()->installEventFilter(mEventHandler.get());
我错过了什么?有人可以解释为什么 MouseEvents 没有到达 eventFilter() 方法吗?
这里有一个解释:
QTableView
继承了QAbstractScrollArea
,所以它就像2个小部件合二为一,容器和viewport
.
默认情况下,
viewport
覆盖了整个容器,鼠标无法访问,这里是我将viewport
的背景设置为蓝色的演示,并且没有修改QTableWidget
:
由此可以看出为什么安装在
QTableWidget
上的事件过滤器没有注册鼠标按下事件。
如果你挤压
viewport
(我通过设置小于QTableWidget
尺寸的最大尺寸来做到这一点),这样它就不会覆盖整个容器,事件过滤器将在QTableWidget
上注册鼠标按下事件,因为现在它是accesible
,并且正在被点击。外观如下: