4

我有这个部分工作,但我面临几个困难:

1) QWebEnginePage 似乎需要一个 QWebEngineView。(参见此处的 setView() 方法:https ://code.woboq.org/qt5/qtwebengine/src/webenginewidgets/api/qwebenginepage.cpp.html )

2) QWebEngineView 除非可见,否则不会呈现。

3) 似乎没有任何方法可以检测视图的哪些区域受到影响。

我想确认这是否可能与新 API 有关?旧的 QT WebKit API 提供了一种方法来做到这一点。

4

1 回答 1

3

是的,这是可能的,

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 有你想要的:)

于 2020-06-23T21:23:48.140 回答