它应该很简单但不知何故它不能正常工作。我试图在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,但即使摆脱它它仍然无法正常工作。
请帮忙。感谢
答案 0 :(得分:2)
有什么阻止它
没错,当您在QListWidget
上按下/释放鼠标按钮时,QMouseEvent
不会发送到QListWidget
。而是将事件发送到发生鼠标事件的小部件,即 QListWidget
的{{3}} 。
事实上,你问题中提到的所有事件都被发送到了视口(因为这是实际发生的事件)。但是,由于视口忽略了它们,这些事件会传播到视口的父窗口小部件(QListWidget
),您在其中安装了事件过滤器并拦截了它们。
为了能够拦截QListWidget
上的点击事件,您必须子类QListWidget
并覆盖viewport (并处理任何事件您对此感兴趣,或者您可以在视口上安装eventfilter :
ui->listWidget->viewport()->installEventFilter(this);