2016-09-27 322 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