QListWidget 上带有 MouseButtonRelease 的 QT eventFilter 未检测到鼠标 press/release
QT eventFilter with MouseButtonRelease on QListWidget is not detecting mouse press/release
它应该很简单,但不知何故它没有正常工作。我正在尝试在 QListWidget 上使用 eventFilter 鼠标按钮按下或释放。 ListWidget 是在 UI 下准备的。我已经像这样安装了 eventFilter
ui->listWidget->installEventFilter(this);
我在 header 下添加了 public:
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,但即使删除它仍然无法正常工作。
请帮忙。谢谢
Something is blocking it
没错,当您 press/release 将鼠标按钮放在 QListWidget
上时,QMouseEvent
不会发送到 QListWidget
。而是将事件发送到发生鼠标事件的小部件,即 QListWidget
的 viewport.
事实上,您问题中提到的所有事件都已发送到视口(因为这是实际发生的事件)。但是由于视口忽略了它们,这些事件传播到视口的父窗口小部件(QListWidget
),您在其中安装了事件过滤器并拦截了它们。
为了能够拦截 QListWidget
上的点击事件,您必须 子类 QListWidget
和覆盖 viewportEvent()
(并处理您感兴趣的任何事件),或者您可以在视口上安装事件过滤器:
ui->listWidget->viewport()->installEventFilter(this);
它应该很简单,但不知何故它没有正常工作。我正在尝试在 QListWidget 上使用 eventFilter 鼠标按钮按下或释放。 ListWidget 是在 UI 下准备的。我已经像这样安装了 eventFilter
ui->listWidget->installEventFilter(this);
我在 header 下添加了 public:
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,但即使删除它仍然无法正常工作。
请帮忙。谢谢
Something is blocking it
没错,当您 press/release 将鼠标按钮放在 QListWidget
上时,QMouseEvent
不会发送到 QListWidget
。而是将事件发送到发生鼠标事件的小部件,即 QListWidget
的 viewport.
事实上,您问题中提到的所有事件都已发送到视口(因为这是实际发生的事件)。但是由于视口忽略了它们,这些事件传播到视口的父窗口小部件(QListWidget
),您在其中安装了事件过滤器并拦截了它们。
为了能够拦截 QListWidget
上的点击事件,您必须 子类 QListWidget
和覆盖 viewportEvent()
(并处理您感兴趣的任何事件),或者您可以在视口上安装事件过滤器:
ui->listWidget->viewport()->installEventFilter(this);