【问题标题】:QT eventFilter with MouseButtonRelease on QListWidget is not detecting mouse press/releaseQListWidget上带有MouseButtonRelease的QT eventFilter未检测到鼠标按下/释放
【发布时间】:2017-07-17 09:55:52
【问题描述】:

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

ui->listWidget->installEventFilter(this);

我在public下的header中添加了:

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 但即使摆脱它仍然无法正常工作。

请帮忙。谢谢

【问题讨论】:

    标签: qt qevent eventfilter


    【解决方案1】:

    有什么东西挡住了它

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

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

    为了能够拦截QListWidget 上的点击事件,您必须子类QListWidget 并覆盖viewportEvent()(并在那里处理您感兴趣的任何事件) , 或者你可以在视口上安装你的事件过滤器

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      相关资源
      最近更新 更多