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