2016-09-27 2 views
2

У меня есть один экземпляр QWebEnginePage, который загружается с некоторыми URL (например, https://www.google.com)Один QWebEnginePage для двух или более QWebEngineView

Я хочу эту страницу, чтобы отображаться в двух 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. Просто хочу опубликовать заключение. - метод view() QWebEnginePage проверяет отношения один-один-один. - исходный код setPage ясно показывает, что «второй раз он просто отключается от первого вида». - «Если текущая страница является дочерним элементом веб-представления, она будет удалена». - не отвечает на мой вопрос вообще. Мои страницы не являются дочерними элементами веб-представления и не удаляются, просто не отображаются оба раза, как я ожидал.

+1

Вы правы, я обновил свой ответ с соответствующим фрагментом кода – 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 и подключить сигналы к их соответствующим слотам (или lambdas, которые вызывают соответствующий нестрочный сеттер) другой страницы. Некоторые, например, scrollPositionChanged, возможно, не имеют соответствующих сеттеров, поэтому вам может быть не повезло для идеальной синхронизации.

+0

никогда не использовал этот метод QWebEnginePage :: вида, но да - этот метод оказывается соотношением один к одному. Однако документация метода setPage http://doc.qt.io/qt-5/qwebengineview.html#setPage говорит, что представление не принимает права собственности на страницу - таким образом, я думал, что это может быть разделено между представлениями. – Dalamber

Смежные вопросы