Qt事件过滤器中 我们可以向一个对象上面安装多个事件处理器,只要调用多次installEVentFilter()函数 举个例子
时间: 2024-02-12 16:04:59 浏览: 92
好的,以下是一个简单的示例代码,展示如何在一个对象上安装多个事件过滤器:
```cpp
class MyEventFilter1 : public QObject
{
Q_OBJECT
public:
MyEventFilter1(QObject *parent = nullptr) : QObject(parent) {}
protected:
bool eventFilter(QObject *obj, QEvent *event) override
{
if (event->type() == QEvent::MouseButtonPress) {
qDebug() << "MyEventFilter1: Mouse button pressed";
// 返回 true 表示事件已经被处理,不再传递给目标对象
return true;
}
// 返回 false 表示该事件未被处理,继续传递给目标对象
return false;
}
};
class MyEventFilter2 : public QObject
{
Q_OBJECT
public:
MyEventFilter2(QObject *parent = nullptr) : QObject(parent) {}
protected:
bool eventFilter(QObject *obj, QEvent *event) override
{
if (event->type() == QEvent::MouseButtonPress) {
qDebug() << "MyEventFilter2: Mouse button pressed";
// 返回 true 表示事件已经被处理,不再传递给目标对象
return true;
}
// 返回 false 表示该事件未被处理,继续传递给目标对象
return false;
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建一个 QLabel 对象
QLabel label("Click me!");
label.show();
// 创建两个事件过滤器对象并分别安装到 QLabel 对象上
MyEventFilter1 filter1;
MyEventFilter2 filter2;
label.installEventFilter(&filter1);
label.installEventFilter(&filter2);
return app.exec();
}
```
以上代码创建了一个 QLabel 对象,并安装了两个事件过滤器对象`filter1`和`filter2`。当用户在该 QLabel 上按下鼠标键时,每个事件过滤器都会捕获并处理该事件。在上面的示例代码中,每个事件过滤器都会输出一条消息,说明它们都已经处理了该事件。需要注意的是,由于 Qt 会按照事件过滤器的安装顺序来逐个调用它们的`eventFilter()`方法,因此在上面的示例中,`MyEventFilter1`会先于`MyEventFilter2`被调用。
阅读全文