bool Widget::event(QEvent *event) { if (event->type()==QEvent::MouseButtonPress) { qDebug()<<"mouse press int event func"; // return true; } else { return QWidget::event(event); } } void Widget::mousePressEvent(QMouseEvent *event) { qDebug()<<"mouse press event func"; }这段代码为什么在event函数中没有起到拦截鼠标点击事件的作用,还是会执行mousePressEvent函数
时间: 2024-02-07 13:03:41 浏览: 22
在 Qt 中,存在事件传递机制。当事件发生时,Qt 会将该事件传递给事件对象的父对象,直到有一个对象对该事件进行处理为止。如果所有的对象都没有处理该事件,则该事件被忽略。
在您的代码中,`event` 函数只是一个事件分发函数,它会将事件传递给对象的 `mousePressEvent` 函数进行处理。因此,即使在 `event` 函数中添加了对鼠标点击事件的处理,但由于事件已经被传递给了 `mousePressEvent` 函数,因此该函数仍然会被调用。
如果您想要在 `event` 函数中拦截鼠标点击事件并阻止其继续传递,可以在处理完事件后将函数返回值设置为 `true`,如下所示:
```
bool Widget::event(QEvent *event) {
if (event->type() == QEvent::MouseButtonPress) {
qDebug() << "mouse press in event function";
// 在此添加处理代码
return true;
} else {
return QWidget::event(event);
}
}
```
这样可以拦截鼠标点击事件并阻止其继续传递,而不会调用 `mousePressEvent` 函数。
相关问题
bool Widget::event(QEvent *event) { if (event->type()==QEvent::MouseButtonPress) { qDebug()<<"mouse press int event func"; } else { return QWidget::event(event); } }为什么在event函数中没有起到拦截鼠标点击事件的作用
在代码中,当鼠标点击事件发生时,程序会进入到 `if` 语句中,并输出 "mouse press int event func",但是在 `if` 语句中并没有任何处理,因此事件会被直接处理掉而不会被拦截。
如果您希望在处理完事件后阻止其继续传递,可以将函数返回值设置为 `true`。因此,您需要在 `if` 语句中添加处理代码,并在处理完事件后返回 `true`,以防止事件继续传递,例如:
```
bool Widget::event(QEvent *event) {
if (event->type()==QEvent::MouseButtonPress)
{
qDebug()<<"mouse press int event func";
// 在此添加处理代码
return true;
}
else
{
return QWidget::event(event);
}
}
```
这样就可以拦截鼠标点击事件并进行处理了。
但我的案例中已经对event函数中的返回值定义为true
是的,你的代码中在处理鼠标按下事件时,`event` 函数返回了 `true`,表示该事件已经被处理。但是,`event` 函数并不会阻止事件的传递,而是告诉上层调用者该事件已经被处理了。如果你想完全阻止事件传递,可以在 `event` 函数中同时返回 `true` 和 `false`,表示该事件已经被处理,并且不再需要继续传递。例如,可以这样修改代码:
```
bool MyLabel::event(QEvent *e) {
if (e->type() == QEvent::MouseButtonPress) {
qDebug() << "mylabel event对鼠标点击事件进行处理" << endl;
return true; // 事件已经被处理,并停止继续传递
}
return QLabel::event(e); // 其他事件继续传递给父类处理
}
```
这样,当事件类型为鼠标按下事件时,`event` 函数返回 `true`,表示该事件已经被处理,并且不再需要继续传递。而对于其他事件,`event` 函数调用 `QLabel` 的 `event` 函数处理,保证了事件能够正常传递。