К сожалению, виджет QWebEngineView
не захватывает практически никаких событий (кроме ввода и вывода мыши, недавно добавленных событий клавиатуры), например см. "[QTBUG-43602] WebEngineView does not handle mouse events".
Практически все события (например, перемещение мыши или краска) обрабатываются QWebEngineView
дочерний делегат частного типа RenderWidgetHostViewQtDelegateWidget
, который является производным от QOpenGLWidget
.
Можно уловить новый ребенок QWebEngineView
типа QOpenGLWidget
и установить на нем дочерний фильтр фильтра событий для всех необходимых событий.
Это решение основывается на недокументированной структуре QWebEngineView
. Таким образом, он может не поддерживаться будущими выпусками Qt. Однако он может использоваться для проектов с текущими версиями Qt. Может быть, в будущем будет реализован еще более удобный интерфейс для улавливания событий 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
.
Сигнал delegatePaint
всегда излучается при изменении веб-представления каким-либо сценарием или путем выделения некоторых элементов управления веб-сайтом из-за наведения мыши или по любой другой причине.
Обратите внимание, что это не то же самое, что и переопределение QWebEngineView::paintEvent
. Таким образом можно получить уведомление только о том, что что-то изменилось.
Таким образом, можно реагировать на события, непосредственно в WebEngineView::eventFilter
или для подключения к сигналу delegatePaint
уведомить другие объекты о веб-просмотра перекраску, например, см QT QWebEngine render after scrolling?
Я бы вырыть в источник - Я не ожидаю QWebEngine быть самой живописи с помощью обычного механизма 'paintEvent', как его рендеринга, он основан на QtQuick 2 (и, таким образом, OpenGL) ... – peppe
'QWebEngineView' не переопределяет' paint'. Если не использовать OpenGl-наложение, то возможно, что вся интеграция растра выполняется непосредственно в 'event'. Попробуйте вместо этого подключить это и посмотреть, не появятся ли какие-либо события рисования. –
@KubaOber Не могли бы вы объяснить, «подцепить эту» часть? –