2016-10-21 3 views
0

У нас уже есть реализация QWebView, и теперь мы хотим перейти на QWebEngineView.Сигнал с нажатием кнопки 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, но мы не можем получить событие с нажатием ссылки.

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

Спасибо заранее.

ответ

0

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

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

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

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

+0

Я попробовал сигнал "urlChanged", но это также не помогает, когда мы щелкаем по ссылке. – Neel

+0

Я использую Qt 5.6 – Neel

+0

Это было бы неплохое решение, но я думаю, что вы могли бы поставить «if (progress == 0) {QUrl url = m_WebEngineView.url();}» в слот, связанный с loadProgress на m_WebEngineView –

0

К сожалению 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 

Для получения дополнительной справки - пожалуйста, используйте официальный example из кварты или одного из kdab или этого видео от Qt Developer Days конференции

0

Override QWebEnginePage :: acceptNavigationRequest в QWebEnginePage подкласса:

bool MyWebPage::acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame) 
{ 
    if (type == QWebEnginePage::NavigationTypeLinkClicked) 
    { 
     qDebug() << url; 
    } 
    return true; 
} 
Смежные вопросы