Сигнал клика по ссылке QWebEngineView

У нас уже есть реализация QWebView, и теперь мы хотим перейти на QWebEngineView.

Через QWebView мы зарегистрировали ниже сигнал для получения уведомления о том, что какая-либо ссылка нажата в веб-просмотре или нет, и мы получаем сигнал в QWebView.

connect(m_WebView, SIGNAL(linkClicked(const QUrl &)),SLOT(urlLinkClicked(const QUrl &)));

В слоте «urlLinkClicked» мы открываем новую вкладку и открываем этот URL в новой вкладке.

У нас возникла проблема с QWebEngineView. Поскольку в QWebEngineView нет такого сигнала "linkClicked". Итак, мы попробовали следующие варианты, но так и не смогли найти решение.

  • В основном классе мы создали экземпляр класса WebEngineView и установили WebEnginePage. Мы можем отображать веб-сайт в классе просмотра, но когда мы нажимаем на любую ссылку, мы не получаем никакого сигнала, поэтому мы не можем открыть этот новый веб-сайт в новой вкладке.

    m_WebEngineView = new QWebEngineView(this); m_WebEngineView->setPage(new QWebEnginePage()); Мы также переопределили метод acceptNavigationRequest, чтобы получить событие перехода по ссылке в mainWebEngineView, но мы не можем получить событие перехода по ссылке.

Любое предложение, которое я могу попробовать?

Заранее спасибо.


person Neel    schedule 21.10.2016    source источник


Ответы (4)


Переопределить QWebEnginePage::acceptNavigationRequest в подклассе QWebEnginePage:

bool MyWebPage::acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame)
{
    if (type == QWebEnginePage::NavigationTypeLinkClicked)
    {
        qDebug() << url;
    }
    return true;
}
person Oleh Pomazan    schedule 07.12.2016
comment
Олег, как заставить QWebEngineView всегда использовать myWebPage? Я вижу, что вы можете установить страницу с элементом подкласса, но если ссылка переходит на новую страницу, кажется, что класс QWebEnginePage будет использоваться для новой страницы в соответствии с классом QWebEngineView. - person mazecreator; 20.11.2019
comment
@mazecreator Если я правильно помню, я использовал doc.qt.io/qt-5 /qwebengineview.html#setPage для предоставления объекта MyWebPage. Будет ли это действительно новый объект QWebEnginePage при нажатии на ссылку? Я не уверен в этом. - person Oleh Pomazan; 21.11.2019
comment
Олег, после быстрой проверки вроде сохраняется класс myWebPage после перехода по ссылке. Немного удивлен, но, вероятно, по дизайну. - person mazecreator; 23.11.2019

Я думаю, вы могли бы использовать сигнал "urlChanged".

См. заголовок «Сигналы» на странице официальной документации. http://doc.qt.io/qt-5/qwebengineview.html

Если это не поможет, мне нужно знать, какую версию фреймворка Qt вы используете.

С наилучшими пожеланиями / Расмус

person Rasmus Jonsson    schedule 21.10.2016
comment
Я попробовал сигнал urlChanged, но это также не помогает, когда мы нажимаем на ссылку. - person Neel; 21.10.2016
comment
Я использую Qt 5.6 - person Neel; 21.10.2016
comment
Это было бы некрасивое решение, но я думаю, что вы могли бы поставить if (progress == 0) { QUrl url = m_WebEngineView.url(); } в слоте, связанном с loadProgress на m_WebEngineView - person Rasmus Jonsson; 21.10.2016
comment
Я только что понял, что в объекте QWebEnginePage также есть urlChanged, может быть, это работает? - person Rasmus Jonsson; 21.10.2016

К сожалению, сигнал urlChanged, который имеет QWebenginePage, выдается только при изменении URL-адреса текущей страницы. Предыдущий сигнал linkClicked также выдавался, когда URL-адрес текущей страницы не менялся. Есть способ справиться с этим, но вам потребуется доступ к исходному коду страницы.

Эта функциональность достигается с помощью класса QWebChannel. Вам нужно будет создать объект webChannel и специальный класс обратного вызова, который будет обрабатывать обратные вызовы с веб-страницы так, как вам нравится. Затем вам нужно будет установить этот webChanell на странице, которую вы хотите, и выполнить все подключения следующим образом:

MyCallBackObject* callback= new MyCallBackClass();
mWebChannel = new QWebChannel(this);
mWebChannel->registerObject(QStringLiteral("MyCallBackObject"), callback);
mWebView->page()->setWebChannel(mWebChannel); // mWebView is QWebEngineView
connect(callback, SIGNAL(urlChanged(QUrl)),
        this, SLOT(linkClickedSlot(QUrl))); // connect statement, urlChanged is defined in your callback class, linkClickedSlot is a slot where you process clicked signal

Для получения дополнительной информации используйте официальный пример из qt или видео с kdab или это видео с Дни разработчиков Qt

person Shf    schedule 21.10.2016

используйте это в унаследованном WebEngineView, и на унаследованной веб-странице мы можем найти hoverdUrl

QWebEngineView *WebEngineView::createWindow(QWebEnginePage::WebWindowType type)
    {
        if(type==QWebEnginePage::WebBrowserTab)
        {
            if(!hoverdUrl.isEmpty())
                QDesktopServices::openUrl(QUrl(hoverdUrl));

             qGlobalDbg("Open external Url requiested in chat, url : " + hoverdUrl, toKIBANA|toLOG);
        }
        //qDebug()<<"============== link Clicked "<<hoverdUrl;
        return NULL;
    }
person Dnyaneshwar    schedule 06.02.2020