在QListWidget上使用MouseButtonRelease的QT eventFilter未检测到鼠标按下/释放

时间:2017-02-26 21:53:45

标签: qt qevent eventfilter

它应该很简单但不知何故它不能正常工作。我试图在QListWidget上按下eventFilter鼠标按钮或释放。 ListWidget是在UI下准备的。我已经像这样安装了eventFilter

ui->listWidget->installEventFilter(this);

我已经在公共标题下添加了标题:

bool eventFilter(QObject *obj, QEvent *event);

在MainWindow下创建

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{

if (event->type() == QEvent::KeyPress)
{

    qDebug() << "Keyboard press";

} else if (event->type() == QEvent::MouseButtonRelease) {

    qDebug() << "Mouse press L";

} else if(event->type() == QEvent::ContextMenu) {

    qDebug() << "Mouse press R";
}

return QObject::eventFilter(obj, event);
}

我已经检查了文档,它说每个事件都会在发送给给定的QWidget之前传递给eventHandler。它部分正确。因为KeyPress和ContextMenu正在运行。即使列表小部件设置为blockingals(true)。

问题是MouseButtonRelease / Press无效。有些事情阻碍了它,我不知道是什么或如何让它发挥作用。 我有on_listWidget_clicked,但即使摆脱它它仍然无法正常工作。

请帮忙。感谢

1 个答案:

答案 0 :(得分:2)

  

有什么阻止它

没错,当您在QListWidget上按下/释放鼠标按钮时,QMouseEvent 不会发送到QListWidget 。而是将事件发送到发生鼠标事件的小部件,即 QListWidget的{​​{3}}

事实上,你问题中提到的所有事件都被发送到了视口(因为这是实际发生的事件)。但是,由于视口忽略了它们,这些事件会传播到视口的父窗口小部件(QListWidget),您在其中安装了事件过滤器并拦截了它们。

为了能够拦截QListWidget上的点击事件,您必须子类QListWidget并覆盖viewport (并处理任何事件您对此感兴趣,或者您可以在视口上安装eventfilter

ui->listWidget->viewport()->installEventFilter(this);