qt - How can I get paint events with QtWebEngine? -
i extended 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
but can't paintevent(qpaintevent *)
called.
#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(); }
can please tell me what's wrong?
unfortunately widget qwebengineview
not catch events (except mouse enter , exit, added keyboard events), example see "[qtbug-43602] webengineview not handle mouse events".
almost events (like mouse move or paint) handled qwebengineview
child delegate of private type renderwidgethostviewqtdelegatewidget
derived qopenglwidget
.
it possible catch new child of qwebengineview
of type qopenglwidget
, install on child event filter hook needed events.
that solution relies on undocumented structure of qwebengineview
. may not supported future qt releases. however, usable projects current qt versions. maybe in future more convenient interface catch qwebengineview
events implemented.
the following subclass of qwebengineview
implements that:
#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 last added qopenglwidget child if (obj == child_ && ev->type() == qevent::paint) { qpaintevent *pe = static_cast<qpaintevent*>(ev); // paint event // ... // or emit signal 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 qobject child should ignored here; // use 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
child adding caught webengineview::event
. child pointer saved , event filter installed on child. on child paint event signal webengineview::delegatepaint(qpaintevent*)
emitted in webengineview::eventfilter
.
the signal delegatepaint
emitted when web view changed script or highlighting of web controls due mouse hover or other reason.
note not same overriding qwebengineview::paintevent
. in way possible receive notification changed.
so, possible react on event directly in webengineview::eventfilter
or connect signal delegatepaint
notify other objects web view repainting, example see qt qwebengine render after scrolling?
Comments
Post a Comment