gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:09:37 24 4
gpt4 key购买 nike

它应该很简单,但不知何故它没有正常工作。我正在尝试在 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 但即使摆脱它它仍然无法正常工作。

请帮忙。谢谢

最佳答案

Something is blocking it

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

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

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

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

在第二种情况下,您可能还需要使用以下代码启用鼠标跟踪:

ui->listWidget->setMouseTracking(true);

关于QListWidget 上带有 MouseButtonRelease 的 QT eventFilter 未检测到鼠标按下/释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42474695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com