Можно ли отображать QWebEnginePage/QWebEngineView вне экрана?

У меня это частично работает, но я столкнулся с несколькими трудностями:

1) Похоже, что QWebEnginePage требует QWebEngineView. (см. метод setView() здесь: https://code.woboq.org/qt5/qtwebengine/src/webenginewidgets/api/qwebenginepage.cpp.html)

2) QWebEngineView не отображается, если он не виден.

3) Похоже, нет никаких средств для определения того, какие области обзора были затронуты.

Я хотел бы подтвердить, возможно ли это сделать с новым API? Старый QT WebKit API предлагал средства для этого.


person mpr    schedule 28.11.2018    source источник


Ответы (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 есть то, что вы хотите :)

person A. Mashreghi    schedule 23.06.2020
comment
Это восхитительно! Очень сложно найти настоящий подход к рендерингу за кадром. - person w1th0utnam3; 05.11.2020