在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。
问题
在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事件,这个问题主要是因为QWebEngineView在加载网页后,其内部有一个子窗口(通常是QOpenGLWidget)接管了鼠标事件,导致父类的鼠标事件处理函数无法被触发。
解决方案
通过重载event函数,截取QEvent::ChildAdded事件,然后为子部件安装事件过滤器。这样可以在事件过滤器中捕获鼠标事件。具体步骤如下:
1、在自定义的QWebEngineView类中重写event函数
2、判断事件类型是否为QEvent::ChildAdded
3、如果是,则获取子对象(通常是QOpenGLWidget),并为它安装事件过滤器
4、在eventFilter函数中处理鼠标事件
#include <QWebEngineView>class CustomWebView : public QWebEngineView {
public:CustomWebView(QWidget* parent = nullptr) : QWebEngineView(parent) {// 关键:设置事件捕获setAttribute(Qt::WA_AcceptTouchEvents);}protected:bool event(QEvent* event) override {// 捕获子控件创建事件if (event->type() == QEvent::ChildAdded) {QChildEvent* childEvent = static_cast<QChildEvent*>(event);if (childEvent->child()->isWidgetType()) {childEvent->child()->installEventFilter(this); // 为子控件安装过滤器}}return QWebEngineView::event(event);}bool eventFilter(QObject* obj, QEvent* event) override {// 处理鼠标按下事件。其他事件也是同理if (event->type() == QEvent::MouseButtonPress) {QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);qDebug() << "捕获到点击位置:" << mouseEvent->pos();return true; // 拦截该事件,不再继续传递。如果只做捕获,这里不要返回。}return QWebEngineView::eventFilter(obj, event);}
};