QWebView:linkClicked不会被某些页面发出(javascript?)

时间:2014-05-06 15:19:30

标签: qt webkit pyqt qtwebkit qwebview

我尝试使用QWebView在我的应用程序的新标签页中打开单击的链接。即使我将一个插槽绑定到linkClicked信号,在某个页面(DuckDuckGo)上也不会发出此信号。

考虑这个(PyQt)示例:

#!/usr/bin/python

import sys

from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebKitWidgets import QWebView, QWebPage

app = QApplication(sys.argv)
wv = QWebView()
wv.load(QUrl.fromUserInput(sys.argv[1]))
wv.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
wv.page().linkClicked.connect(lambda url: print("Clicked: " + url.toString()))
wv.show()
app.exec_()

注意我将linkDelegationPolicy正确设置为DelegateAllLinks

现在,在执行python example.py http://www.stackoverflow.com/之类的操作并点击链接时,它会被打印到stdout而不会打开,就像它应该的那样。

然而,当通过python example.py http://www.duckduckgo.com/?q=foo执行相同操作并点击其中一个结果时,只需加载结果,而不会收到linkClicked信号。

我猜他们会以某种方式通过Javascript动态加载打开的页面。

即使没有收到信号,我仍然可以强制在新标签页中打开它吗?

1 个答案:

答案 0 :(得分:0)

你的猜测是正确的。当网页使用Javascript进行导航时,您将无法获得信号。

documentation

中有相关说明

修改

我忘了添加您可以尝试将javascript注入到将使用QT WebKit bridge与您的主应用程序进行通信的页面。如果您想处理一小组网站,这可能是一个很好的解决方案。如果您需要在每个可能的网页上工作的通用解决方案,那将是一项艰巨的任务。 Web开发人员在他们的页面上发明了多种导航方式,您可能需要为每个方法定制一个javascript,并找到应该在任何给定页面应用哪种解决方案。