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 21:03:41 浏览: 115
在 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);
}
}
```
这样就可以拦截鼠标点击事件并进行处理了。
c++ qt widget窗口中有一个qpushbutton对象,给出结合event()函数、accept()、ignore()函数的例子
好的,这是一个关于QWidget窗口中QPushButton对象的事件处理的例子:
```cpp
class MyWidget : public QWidget {
public:
MyWidget(QWidget* parent = nullptr) : QWidget(parent) {
QPushButton* button = new QPushButton("测试按钮", this);
button->move(50, 50);
button->show();
}
protected:
bool event(QEvent* e) override {
if (e->type() == QEvent::MouseButtonPress) {
qDebug() << "鼠标按下";
e->accept(); // 消费事件,不传递给父级
return true;
}
else if (e->type() == QEvent::MouseButtonRelease) {
qDebug() << "鼠标释放";
e->ignore(); // 不消费事件,传递给父级
return false;
}
else {
return QWidget::event(e); // 其他事件交给父类处理
}
}
};
```
在这个例子中,我们自定义了一个QWidget的子类,重载了它的event()函数,来处理鼠标按下和释放事件。在构造函数中,我们创建了一个QPushButton对象,并将它添加到窗口中。如果是鼠标按下事件,我们打印一条消息,并消费事件(不传递给父级处理)。如果是鼠标释放事件,我们同样打印一条消息,但不消费事件(继续传递给父级处理)。对于其他事件,我们直接交给父类去处理。
现在我们可以在代码中创建这个自定义窗口,并测试它的事件处理:
```cpp
MyWidget* widget = new MyWidget;
widget->show();
```
当我们点击窗口中的按钮时,会在控制台输出"鼠标按下",当我们释放按钮时,会输出"鼠标释放"。由于我们在鼠标按下事件中消费了事件,所以鼠标释放事件不会触发按钮的clicked()信号。
在这个例子中,我们同样使用了accept()和ignore()函数。这两个函数通常用于处理一些特定的事件,例如QKeyEvent。当我们在重载keyPressEvent()函数时,如果我们想消费某个特定按键的事件,可以调用accept()函数,否则调用ignore()函数。这样做可以防止事件被传递给父级,或者被其他控件消费。
阅读全文