2017-02-26 112 views
1

它应该很简单,但不知何故它不能正常工作。我试图捕捉eventFilter鼠标按钮按下或释放QListWidget。 ListWidget是在UI下编写的。我已经安装了eventFilter这样QT eventFilter with MouseButtonRelease on QListWidget未检测到鼠标按下/释放

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正在工作。即使列表小部件被设置为blocksingals(true)。

问题是MouseButtonRelease/Press不起作用。有些东西阻止它,我不知道如何使它工作。 我也有on_listWidget_clicked,但即使摆脱它,它仍然无法正常工作。

请帮忙。由于

回答

1

有物体挡住它

这是正确的,当你按下/松开QListWidget你的鼠标按钮时,QMouseEvent不会发送到QListWidget。相反,事件发送到鼠标事件发生的小部件,即QListWidgetviewport

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

为了能够拦截在QListWidget click事件,你必须要么子类QListWidget并覆盖viewportEvent()(和处理你是什么事件感兴趣那里),或者您也可以安装你的eventfilter而不是视口

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

太棒了!感谢它的工作:) – Pilot