提问人:Mickaël C. Guimarães 提问时间:5/5/2023 最后编辑:Abderrahmene Rayene MihoubMickaël C. Guimarães 更新时间:5/7/2023 访问量:129
QTableView 事件过滤器未检测到某些鼠标事件
QTableView event filter not detecting some mouse events
问:
我在 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官方文档没有说明在eventFilter机制中对MouseEvents进行任何限制/排除。
我错过了什么?有人可以解释为什么 MouseEvents 没有到达 eventFilter() 方法吗?
我可以实现我想要的覆盖,但这不是我的首选解决方案,我想了解导致这种行为的原因。QTableView::mousePressEvent()
答:
尝试将事件过滤器安装到表视图的 .viewport()
ui->groupBox->getView()->viewport()->installEventFilter(mEventHandler.get());
我错过了什么?有人可以解释为什么 MouseEvents 没有到达 eventFilter() 方法吗?
下面是一个解释:
QTableView
是继承的,所以它就像 2 个小部件合二为一,容器和 .QAbstractScrollArea
viewport
默认情况下,覆盖整个容器,使其无法被鼠标按下访问,这是一个演示,我将背景设置为蓝色,并且没有修改:viewport
viewport
QTableWidget
由此,可以找出为什么安装的事件过滤器注册了没有鼠标按下事件。QTableWidget
如果压缩(我通过设置小于 size 的最大尺寸来做到这一点),使其不覆盖整个容器,则事件过滤器将注册鼠标按下事件,因为现在它可以访问并且正在被单击。下面是它的外观:viewport
QTableWidget
QTableWidget
评论