QWebEngineView создать окно

ОК, ломаю голову, пытаясь понять QWebEngine.

Я понимаю концепцию реализации виртуальных функций, но я не уверен, как получить URL-адрес, по которому щелкнул пользователь, являющийся ссылкой newTab/newWindow, запрошенной страницей или представлением.

QWebEngineView * WebEngineTabView::createWindow(QWebEnginePage::WebWindowType type)
{
// signal Main window for a new view( @URL )
emit requestNewTab(page()->requestedUrl());
}

Это для образовательного браузерного приложения GPL Любая помощь приветствуется


person ArchNemSyS    schedule 29.09.2015    source источник


Ответы (2)


Вы видели, как это делается в примере демобраузера?

QWebEnginePage *WebPage::createWindow(QWebEnginePage::WebWindowType type)
{
    if (type == QWebEnginePage::WebBrowserTab) {
        return mainWindow()->tabWidget()->newTab()->page();
    } else if (type == QWebEnginePage::WebBrowserWindow) {
        BrowserApplication::instance()->newMainWindow();
        BrowserMainWindow *mainWindow = BrowserApplication::instance()->mainWindow();
        return mainWindow->currentTab()->page();
    } else {
        PopupWindow *popup = new PopupWindow(profile());
        popup->setAttribute(Qt::WA_DeleteOnClose);
        popup->show();
        return popup->page();
    }
}

Если вы все же хотите делегировать эту работу, уведомляя главное окно/приложение/что-то еще, вы, вероятно, можете перехватывать клики и хранить ссылки, но я не уверен в порядке вызовов, плюс вы должны обратить внимание на случаи, когда запрошенное окно является просто «новая вкладка» (пустая вкладка без URL):

bool WebPage::acceptNavigationRequest(const QUrl & url, NavigationType type, bool isMainFrame)
{
    switch( type )
    {
        case QWebEnginePage::NavigationTypeLinkClicked:
        {
            mLastClickedLink = url; //-- clear it in WebPage::createWindow
            return true;
        }
        default:
            return QWebEnginePage::acceptNavigationRequest( url, type, isMainFrame );
    }
}
person sendevent    schedule 26.01.2016

Если вы посмотрите исходный код Qt, то увидите, что после вызова функции QWebEnginePage::createWindow для создания указателя QWebEnginePage в этот указатель будут записаны некоторые данные. См. https://code.qt.io/cgit/qt/qtwebengine.git/tree/src/webenginewidgets/api/qwebenginepage.cpp?h=5.9#n404

Для меня работает следующий пример:

class MyWebEnginePage : public QWebEnginePage
{
    ...
    QWebEnginePage *createWindow(WebWindowType type) Q_DECL_OVERRIDE
    {
        QWebEnginePage *page = new QWebEnginePage();
        connect(page, &QWebEnginePage::urlChanged, this, [this] (const QUrl &url) {
            emit newPageUrlChanged(url);
        }

        return page;
    }

signals:
    void newPageUrlChanged(const QUrl &url);
};

class MyClass : public QObject
{
    ...
    MyClass()
    {
        connect(m_pPage, &MyWebEnginePage::newPageUrlChanged, this, &MyClass::onNewPageUrlChanged);
    }
private slots:
    void onNewPageUrlChanged(const QUrl &url)
    {
        qDebug() << url; // new url will be printed here
    }
private:
    MyWebEnginePage *m_pPage;
}

Надеюсь это поможет

person LittleTull    schedule 28.01.2019