残念ながら、ウィジェットQWebEngineView
はほとんどすべてのイベントをキャッチしません (マウスの開始と終了、最近追加されたキーボード イベントを除く)。
ほとんどすべてのイベント (マウスの移動やペイントなど) は、 から派生した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
何らかのスクリプトによって、またはマウス ホバーやその他の理由により一部の Web コントロールが強調表示されることによって、Web ビューが変更されると、常にシグナルが発せられます。
オーバーライドと同じではないことに注意してくださいQWebEngineView::paintEvent
。そのようにして、何かが変更されたという通知のみを受け取ることができます。
そのため、イベントに直接反応しWebEngineView::eventFilter
たり、信号に接続して、delegatePaint
Web ビューの再描画について他のオブジェクトに通知することができます。たとえば、QT QWebEngine render after scrolling?を参照してください。