我尝试使用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动态加载打开的页面。
即使没有收到信号,我仍然可以强制在新标签页中打开它吗?
答案 0 :(得分:0)
你的猜测是正确的。当网页使用Javascript进行导航时,您将无法获得信号。
中有相关说明修改强>
我忘了添加您可以尝试将javascript注入到将使用QT WebKit bridge与您的主应用程序进行通信的页面。如果您想处理一小组网站,这可能是一个很好的解决方案。如果您需要在每个可能的网页上工作的通用解决方案,那将是一项艰巨的任务。 Web开发人员在他们的页面上发明了多种导航方式,您可能需要为每个方法定制一个javascript,并找到应该在任何给定页面应用哪种解决方案。