【问题标题】:Link clicked signal QWebEngineView链接点击信号 QWebEngineView
【发布时间】:2017-03-03 09:12:06
【问题描述】:

我们已经实现了 QWebView,现在我们想迁移到 QWebEngineView。

通过 QWebView,我们在下面注册了信号以接收有关在 webview 上单击任何链接的通知,并且我们在 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 中的链接点击事件,但我们无法获取链接点击事件。

有什么建议可以试试?

提前致谢。

【问题讨论】:

    标签: c++ qt webkit qtwebengine


    【解决方案1】:

    在 QWebEnginePage 子类中重写 QWebEnginePage::acceptNavigationRequest:

    bool MyWebPage::acceptNavigationRequest(const QUrl &url, NavigationType type, bool isMainFrame)
    {
        if (type == QWebEnginePage::NavigationTypeLinkClicked)
        {
            qDebug() << url;
        }
        return true;
    }
    

    【讨论】:

    • Oleh,如何让 QWebEngineView 始终使用“myWebPage”?我看到您可以使用子类项设置页面,但是如果链接到新页面,则根据 QWebEngineView 类,新页面似乎将使用“QWebEnginePage”类。
    • @mazecreator 如果我没记错的话,我使用doc.qt.io/qt-5/qwebengineview.html#setPage 来提供MyWebPage 对象。当您单击链接时,它确实是新的 QWebEnginePage 对象吗?我不确定。
    • Oleh,经过快速测试,单击链接后似乎确实保留了“myWebPage”类。有点惊讶,但可能是设计使然。
    【解决方案2】:

    我认为你可以使用信号“urlChanged”。

    查看官方文档页面上的标题“信号”。 http://doc.qt.io/qt-5/qwebengineview.html

    如果这没有帮助,我需要知道您使用的 Qt 框架的版本。

    最好的问候 /拉斯穆斯

    【讨论】:

    • 我尝试了“urlChanged”信号,但是当我们点击链接时也没有帮助。
    • 我使用的是 Qt 5.6
    • 这不是一个很好的解决方案,但我认为您可以将“if (progress == 0) { QUrl url = m_WebEngineView.url(); }”放在与 m_WebEngineView 上的 loadProgress 链接的插槽中
    • 我刚刚意识到 QWebEnginePage 对象上也有一个“urlChanged”,也许这行得通?
    【解决方案3】:

    不幸的是,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的官方example或来自kdab的一个或来自Qt Developer Days会议的视频

    【讨论】:

      【解决方案4】:

      在继承的 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;
          }
      

      【讨论】:

        猜你喜欢
        • 2019-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多