Pil*_*lot 5 qt qevent eventfilter
它应该很简单,但不知何故它没有按预期工作。我试图用 eventFilter 捕获 QListWidget 上的鼠标按钮按下或释放。ListWidget是在UI下准备的。我已经像这样安装了 eventFilter
ui->listWidget->installEventFilter(this);
Run Code Online (Sandbox Code Playgroud)
我在公共标题下添加了:
bool eventFilter(QObject *obj, QEvent *event);
Run Code Online (Sandbox Code Playgroud)
并在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);
}
Run Code Online (Sandbox Code Playgroud)
我已经检查过文档,它说每个事件在发送到给定的 QWidget 之前都会传递到 eventHandler 。这部分是正确的。因为 KeyPress 和 ContextMenu 正在工作。即使列表小部件设置为blocksingals(true)。
问题是 MouseButtonRelease/Press 不起作用。有东西阻碍了它,我不知道什么或如何让它发挥作用。我也有 on_listWidget_clicked 但即使摆脱它它仍然无法工作。
请帮忙。谢谢
有东西挡住了它
没错,当您在 上按下/释放鼠标按钮时QListWidget,QMouseEvent 不会发送到QListWidget。相反,事件被发送到发生鼠标事件的小部件,即QListWidgetviewport。
事实上,您问题中提到的所有事件都被发送到视口(因为这是事件实际发生的地方)。但由于视口忽略了它们,这些事件会传播到视口的父小部件( ),QListWidget您在其中安装了事件过滤器并拦截了它们。
为了能够拦截 a 上的单击事件QListWidget,您必须子类化QListWidget并覆盖viewportEvent()(并处理您感兴趣的任何事件),或者您可以在视口上安装事件过滤器:
ui->listWidget->viewport()->installEventFilter(this);
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,您可能还需要使用以下代码启用鼠标跟踪:
ui->listWidget->setMouseTracking(true);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2902 次 |
| 最近记录: |