一个 QWebEnginePage 用于两个或多个 QWebEngineView
One QWebEnginePage for two or more QWebEngineView
我有一个 QWebEnginePage 实例,其中加载了一些 url(例如 https://www.google.com)
我希望此页面显示在两个 QWebEngineView 中,但 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 上消失。
更新。
只想post下结论。
- QWebEnginePage 的 view() 方法证明一对一的关系。
- setPage源代码清楚地表明"Second time it just disconnects from the first view."
- "If the current page is a child of the web view, it will be deleted." - 根本没有回答我的问题。我的页面不是网络视图的子页面,也没有被删除,只是没有像我预期的那样同时呈现。
QWebEnginePage
有一个方法 QWebEnginePage::view
,returns 指向当前显示页面的 QWidget
的指针。因此,根据定义,它只能有一个视图,尽管该视图不拥有页面的所有权(所有权始终是一对一的关系)
我建议创建两个 QWebEnginePage
实例并将信号连接到另一页的它们各自的插槽(或调用相应非插槽 setter 的 lambda)。有些像 scrollPositionChanged
可能没有相应的 setter,所以你可能无法完美同步。
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
}
我有一个 QWebEnginePage 实例,其中加载了一些 url(例如 https://www.google.com)
我希望此页面显示在两个 QWebEngineView 中,但 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 上消失。
更新。 只想post下结论。 - QWebEnginePage 的 view() 方法证明一对一的关系。 - setPage源代码清楚地表明"Second time it just disconnects from the first view." - "If the current page is a child of the web view, it will be deleted." - 根本没有回答我的问题。我的页面不是网络视图的子页面,也没有被删除,只是没有像我预期的那样同时呈现。
QWebEnginePage
有一个方法 QWebEnginePage::view
,returns 指向当前显示页面的 QWidget
的指针。因此,根据定义,它只能有一个视图,尽管该视图不拥有页面的所有权(所有权始终是一对一的关系)
我建议创建两个 QWebEnginePage
实例并将信号连接到另一页的它们各自的插槽(或调用相应非插槽 setter 的 lambda)。有些像 scrollPositionChanged
可能没有相应的 setter,所以你可能无法完美同步。
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
}