QListWidget上带有MouseButtonRelease的QT eventFilter未检测到鼠标按下/释放

QListWidget上带有MouseButtonRelease的QT eventFilter未检测到鼠标按下/释放,qt,qevent,eventfilter,Qt,Qevent,Eventfilter,它应该很简单,但不知怎么的,它并没有像它应该的那样工作。我正在尝试捕捉QListWidget上的eventFilter鼠标按钮按下或释放。ListWidget是在UI下准备的。我已经像这样安装了eventFilter ui->listWidget->installEventFilter(this); 我在“公共”下的标题中添加了: bool eventFilter(QObject *obj, QEvent *event); 并在主窗口下创建 bool MainWindow::ev

它应该很简单,但不知怎么的,它并没有像它应该的那样工作。我正在尝试捕捉QListWidget上的eventFilter鼠标按钮按下或释放。ListWidget是在UI下准备的。我已经像这样安装了eventFilter

ui->listWidget->installEventFilter(this);
我在“公共”下的标题中添加了:

bool eventFilter(QObject *obj, QEvent *event);
并在主窗口下创建

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);
}
bool主窗口::事件过滤器(QObject*obj,QEvent*event)
{
如果(事件->类型()==QEvent::按键)
{
qDebug()类型()==QEvent::MouseButtonRelease){
qDebug()类型()==QEvent::ContextMenu){
qDebug()
有东西挡住了它

没错,当您在
QListWidget
上按下/释放鼠标按钮时,
QMouseEvent
不会被发送到
QListWidget
。相反,事件被发送到发生鼠标事件的小部件,即
QListWidget

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

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

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