gpt4 book ai didi

qt - 如何使用 QtWebEngine 获取绘制事件?

转载 作者:行者123 更新时间:2023-12-01 22:19:13 25 4
gpt4 key购买 nike

我扩展了QWebEngineView

#ifndef MYQWEBENGINEVIEW_H
#define MYQWEBENGINEVIEW_H
#include <QWebEngineView>
class MyQWebEngineView : public QWebEngineView
{
public:
MyQWebEngineView(QWidget *parent = 0);
~MyQWebEngineView();
protected:
virtual void paintEvent(QPaintEvent *);
};
#endif // MYQWEBENGINEVIEW_H

但是我无法调用paintEvent(QPaintEvent *)

#include "myqwebengineview.h"
#include <QPaintEvent>
#include <QPainter>
#include <QWebEngineView>
#include <QWidget>

MyQWebEngineView::MyQWebEngineView(QWidget *parent):QWebEngineView(parent)
{
qDebug() << "MyQWebEngineView(" << parent << ")";
qDebug() << "Qt::WA_PaintOnScreen: " << testAttribute(Qt::WA_PaintOnScreen);
//setAttribute(Qt::WA_PaintOnScreen, true);
}
MyQWebEngineView::~MyQWebEngineView()
{
}
void MyQWebEngineView::paintEvent(QPaintEvent * event)
{
qDebug() << "paintEvent(" << event << ")";
QWebEngineView::paintEvent(event);
//QWidget::paintEvent(event);

qDebug() << event->rect();
qDebug() << event->region();
}

谁能告诉我出了什么问题吗?

最佳答案

不幸的是,小部件QWebEngineView几乎无法捕获任何事件(鼠标进入和退出、最近添加的键盘事件除外),例如参见 "[QTBUG-43602] WebEngineView does not handle mouse events" .

几乎所有事件(例如鼠标移动或绘制)均由派生自 QOpenGLWidget 的私有(private)类型 RenderWidgetHostViewQtDelegateWidgetQWebEngineView 子委托(delegate)处理。

可以捕获 QOpenGLWidget 类型的 QWebEngineView 的新子级,并在此子级上安装所有所需事件的事件过滤器 Hook 。

该解决方案依赖于未记录的 QWebEngineView 结构。因此, future 的 Qt 版本可能不支持它。但是,它可用于具有当前 Qt 版本的项目。也许将来会实现一些更方便的接口(interface)来捕获 QWebEngineView 事件。

QWebEngineView 的以下子类实现了这一点:

#ifndef WEBENGINEVIEW_H
#define WEBENGINEVIEW_H

#include <QEvent>
#include <QChildEvent>
#include <QPointer>
#include <QOpenGLWidget>
#include <QWebEngineView>
#include <QPaintEvent>

class WebEngineView : public QWebEngineView
{
Q_OBJECT

private:
QPointer<QOpenGLWidget> child_;

protected:
bool eventFilter(QObject *obj, QEvent *ev)
{
// emit delegatePaint on paint event of the last added QOpenGLWidget child
if (obj == child_ && ev->type() == QEvent::Paint) {
QPaintEvent *pe = static_cast<QPaintEvent*>(ev);
// do something with paint event
// ...
// or just emit signal to notify other objects
emit delegatePaint(pe);
}

return QWebEngineView::eventFilter(obj, ev);
}

public:
WebEngineView(QWidget *parent = nullptr) :
QWebEngineView(parent), child_(nullptr)
{
}

bool event(QEvent * ev)
{
if (ev->type() == QEvent::ChildAdded) {
QChildEvent *child_ev = static_cast<QChildEvent*>(ev);

// there is also QObject child that should be ignored here;
// use only QOpenGLWidget child
QOpenGLWidget *w = qobject_cast<QOpenGLWidget*>(child_ev->child());
if (w) {
child_ = w;
w->installEventFilter(this);
}
}

return QWebEngineView::event(ev);
}

signals:
void delegatePaint(QPaintEvent*);
};

#endif // WEBENGINEVIEW_H

子项添加被WebEngineView::event捕获。保存子指针并将事件过滤器安装在该子指针上。在子绘制事件上,信号 WebEngineView::delegatePaint(QPaintEvent*)WebEngineView::eventFilter 中发出。

当 Web View 被某些脚本更改或由于鼠标悬停或任何其他原因突出显示某些 Web 控件时,始终会发出信号 delegatePaint

请注意,它与重写QWebEngineView::paintEvent不同。这样,就可以只接收某些内容发生更改的通知。

因此,可以直接在 WebEngineView::eventFilter 中对事件使用react,或者连接到信号 delegatePaint 来通知其他对象有关 Web View 重绘的信息,例如示例参见 QT QWebEngine render after scrolling?

关于qt - 如何使用 QtWebEngine 获取绘制事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30566101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com