2016-09-27 321 views
2

我有一个装有一些URL(如https://www.google.com一个QWebEnginePage两个或两个以上QWebEngineView

我想两个QWebEngineViews要显示此页面QWebEnginePage的一个实例,但它看起来像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视图的子项,它将被删除。” - 根本不回答我的问题。我的页面不是Web视图的子项,并且不会被删除,只是不会像我期望的那样同时呈现这两个页面。

+1

你说得对,我已经更新了我的答案与相关一件从未使用过QWebEnginePage ::观点方法的代码 – demonplus

回答

2

QWebEnginePage不能连接到两个QWebEngineView s。

您将很容易理解当您拨打setPage两次时会发生什么情况,当您看Qt sources时,请参阅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 
} 
+0

@Joe当他第二次调用setPage时,页面从第一个视图中解除绑定。任何方式,有必要创建两个页面实例,使其工作 – demonplus

+1

是的,但该报价与这一事实无关。 – Joe

+0

@Joe,同意 - 我删除了错误的报价并添加了一段代码,它解释了setPage()期间发生的情况。 – demonplus

0

QWebEnginePage有一个方法QWebEnginePage::view,它返回一个指向QWidget当前显示页面的指针。因此,尽管事实上该视图并不拥有页面的所有权(其中所有权始终是一对一关系),但根据定义,它只能具有单一视图。

我建议创建两个QWebEnginePage实例并连接将信号发送到其他页面的它们各自的槽(或称为相应的非槽设置器的lambda)。有些人喜欢scrollPositionChanged可能没有相应的设置器,所以你可能会失去理想的同步。

+0

,但肯定的 - 这种方法证明了一比一的关系。但是,setPage方法文档http://doc.qt.io/qt-5/qwebengineview.html#setPage指出View并不拥有页面的所有权 - 因此我认为它可以在视图之间共享。 – Dalamber