是否可以在屏幕外渲染 QWebEnginePage/QWebEngineView?
Posted
技术标签:
【中文标题】是否可以在屏幕外渲染 QWebEnginePage/QWebEngineView?【英文标题】:Is it possible to render QWebEnginePage/QWebEngineView offscreen? 【发布时间】:2018-11-28 17:05:47 【问题描述】:我有这个部分工作,但我面临几个困难:
1) QWebEnginePage 似乎需要一个 QWebEngineView。 (参见此处的 setView() 方法:https://code.woboq.org/qt5/qtwebengine/src/webenginewidgets/api/qwebenginepage.cpp.html)
2) QWebEngineView 除非可见,否则不会呈现。
3) 似乎没有任何方法可以检测视图的哪些区域受到了影响。
我想确认这是否可能与新 API 相关?旧的 QT WebKit API 提供了一种方法来做到这一点。
【问题讨论】:
【参考方案1】:是的,有可能,
Scene = std::make_unique<QGraphicsScene>();
HiddenView = std::make_unique<QGraphicsView>(mScene.get());
WebView = std::make_unique<QWebEngineView>();
Scene->addWidget(mWebView.get());
WebView->resize(size); //any QSize you like
WebView->load(url); // give your url here
mWebView->show(); //this doesn't actually show, just enables you to render offscreen, see below
ImageData = QImage(size, QImage::Format_ARGB32);
connect(mWebView.get(), &QWebEngineView::loadFinished, this, &ClassA::onViewLoaded);
然后,在 onViewLoaded 中,我们调用一个 update() 方法来定期渲染。请注意,'this' 是 ClassA 的对象。
void ClassA::onViewLoaded()
Timer = std::make_unique<QTimer>();
connect(mTimer.get(), &QTimer::timeout, , &SpaOffscreenRender::update);
mTimer->start(30); //every 30 miliseconds
最后你会像这样渲染:
void ClassA::update()
QPainter painter(&ImageData);
WebView->page()->view()->render(&painter);
painter.end();
ImageData 有你想要的 :)
【讨论】:
太棒了!真的很难找到这种真正的离屏渲染方式。以上是关于是否可以在屏幕外渲染 QWebEnginePage/QWebEngineView?的主要内容,如果未能解决你的问题,请参考以下文章
如何捕获 QWebEnginePage::view 渲染的图像?
Qt5 中屏幕和屏幕外渲染与 QOpenGL\* 类之间的交互