一个QWebEnginePage用于两个或更多QWebEngineView

时间:2016-09-27 10:56:24

标签: c++ qt qtwebengine

我有一个QWebEnginePage实例加载了一些网址(例如https://www.google.com

我希望这个页面显示在两个QWebEngineViews中,但看起来Qt不允许这样做。

一旦我在一个视图上调用setPage,另一个视图就会停止渲染页面。 看起来这是一个所有权问题或类似的问题,但我在Qt文档中没有看到任何相关信息。

其他人遇到过这样的问题?

auto p = new QWebEnginePage();
p->load(QUrl("https://www.google.com"));

auto w1 = new QWebEngineView();
auto w2 = new QWebEngineView();

w1->setPage(p);
w2->setPage(p);

w1->show();
w2->show();

我希望两个视图都显示相同的页面,但只有w2显示它。如果您稍后致电w1->setPage(p) - 该页面将显示在w1上,并将从w2中消失。

UPD。 只想发表结论。 - QWebEnginePage的view()方法证明了一对一的关系。 - setPage源代码清楚地显示"第二次它只是从第一个视图断开连接。" - "如果当前页面是Web视图的子页面,则将被删除。" - 根本没有回答我的问题。我的网页不是网页视图的子网,也不会被删除,只是没有像我预期的那样同时呈现。

2 个答案:

答案 0 :(得分:2)

QWebEnginePage无法连接到两个QWebEngineView

当您查看Qt sources时,您可以轻松了解当您setPage两次致电时会发生什么,请参阅setPage功能。第二次它只是从第一个视图断开。

void QWebEngineView::setPage(QWebEnginePage* page)
{
    QWebEngineViewPrivate::bind(this, page);
}

void QWebEngineViewPrivate::bind(QWebEngineView *view, QWebEnginePage *page)
{
    if (view && page == view->d_func()->page)
        return;

    if (page) {
        // Un-bind page from its current view.
        if (QWebEngineView *oldView = page->d_func()->view) {
            page->disconnect(oldView);
            oldView->d_func()->page = 0;
        }
        page->d_func()->view = view;
        page->d_func()->adapter->reattachRWHV();
    }

    if (view) {
        // Un-bind view from its current page.
        if (QWebEnginePage *oldPage = view->d_func()->page) {
            oldPage->disconnect(view);
            oldPage->d_func()->view = 0;
            oldPage->d_func()->adapter->reattachRWHV();
            if (oldPage->parent() == view)
                delete oldPage;
        }
        view->d_func()->page = page;
    }

    // skipped
}

答案 1 :(得分:0)

QWebEnginePage有一个方法QWebEnginePage::view,它返回指向当前显示页面的QWidget的指针。因此,根据定义,它只能有一个视图,尽管视图不占用页面的所有权(所有权始终是一对一的关系)

我建议创建两个QWebEnginePage个实例,并将信号连接到另一个页面的各自的插槽(或称为相应的非插槽设置器的lambda)。有些像scrollPositionChanged可能没有相应的setter,所以你可能会因完美同步而失去运气。