2014-05-06 21 views
2

我試圖打開我的應用程序中使用QWebView的新選項卡中點擊鏈接。即使我將一個插槽綁定到linkClicked信號上,在某個頁面(DuckDuckGo)上,該信號也不會被髮射。QWebView:linkClicked不會與某些頁面發射(JavaScript?)

考慮這個(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_() 

說明我正確設置linkDelegationPolicyDelegateAllLinks

現在,當做類似python example.py http://www.stackoverflow.com/的事情,並點擊一個鏈接,它會打印到標準輸出並不打開,就像它應該。

但是,當通過python example.py http://www.duckduckgo.com/?q=foo進行同樣的操作並點擊其中一個結果時,結果會被簡單加載而不會得到linkClicked信號。

我的猜測是他們以某種方式通過Javascript動態加載打開的頁面。

是否仍然有辦法強制這個功能在新標籤中打開,儘管沒有得到信號?

+0

可能重複[QWebView自動選項卡](http://stackoverflow.com/questions/4766186/qwebview-auto-tabs) – M4rtini

+0

@ M4rtini在這個問題中,提問者不知道「linkClicked」。我的問題是 - 如我的示例所示 - linkClicked'不應該發射時,它應該。這是兩件完全不同的事情。 (雖然我的最後一句話提到了「新標籤」,因爲這是我的用例,但我會澄清這一點) –

回答

0

你的猜測是正確的。當網頁使用Javascript進行導航時,您將無法獲得信號。

有關於它的documentation

編輯

我忘了補充一點,你可以嘗試注入javascript來將使用QT WebKit bridge與主應用程序進行通信的頁面的說明。如果你想處理一小部分網站,這可能是一個很好的解決方案。如果你需要一個在每個可能的網頁上工作的通用解決方案,這將是一項艱鉅的任務。 Web開發人員可以通過多種方式在他們的頁面上進行導航,並且您可能需要爲其中的每個人定製一個JavaScript,並找到在任何給定頁面上應用哪種解決方案的方法。