2016-05-21 18 views
3

首先,我想說清楚,這種奇怪的行爲並不適用於每個網站。爲什麼「linkClicked(const QUrl&)」信號沒有捕獲到鼠標左鍵的QUrl?

下面是從我web browser代碼:

def compose_tab(self, index): 
    self.tabs[index].append(QtWebKit.QWebView()) 
    self.tabs[index][0].setLayout(self.tabs[index][1]) 
    self.tabs[index][1].addWidget(self.tabs[index][2]) 
    self.tabs[index][2].connect(self.tabs[index][2], QtCore.SIGNAL("linkClicked(const QUrl&)"), self.update_link) 
    # to be written... 
    self.tabs[index][2].connect(self.tabs[index][2], QtCore.SIGNAL("OPEN_IN_NEW_TAB"), lambda: [ 
     # self.add_tab(len(self.tabs)-1), 
     None, 
     None 
    ]) 
    self.tabs[index][2].load(QtCore.QUrl("http://www.google.com")) 
    self.url_field.setText("http://www.google.com") 
    self.tabs[index][2].page().setLinkDelegationPolicy(QtWebKit.QWebPage.DelegateAllLinks) 
    self.tabs[self.tab_stack.currentIndex()][2].loadProgress.connect(lambda: self.tab_stack.setTabText(
     self.tab_stack.currentIndex(), 
     "Loading..." 
    )) 
    try: 
     self.tabs[self.tab_stack.currentIndex()][2].loadFinished.connect(lambda: self.tab_stack.setTabText(
      self.tab_stack.currentIndex(), 
      self.tabs[self.tab_stack.currentIndex()][2].page().mainFrame().findFirstElement("title").toPlainText() 
     )) 
    except NameError as e: 
     pass 
    self.current_links.insert(index, self.url_field.text()) 
    self.tabs[index][2].show() 

正如你所看到的,每個選項卡上有一個QWebView與update_link方法連接,這是這一個:

def update_link(self, url): 
    self.url_field.setText(url.toString()) 
    self.current_links[self.tab_stack.currentIndex()] = url.toString() 
    self.tabs[self.tab_stack.currentIndex()][2].load(url) 

因此,每個點擊鏈接時,URL字段將通過傳遞給方法的QUrl進行更新。它在維基百科等網站中工作得很好,但它在YouTube上效果不佳(例如)。 As one can read from the docs,如果涉及Javascript,信號可能不會發射。這是「好」,但有一個問題:

信號確實得到發射時,我用鼠標中鍵點擊鏈接(這是沒有意義!)。

因此,如果我用第一個鼠標按鈕訪問YouTube上的視頻,URL字段不會更新,因爲沒有QUrl傳遞給update_link方法,但是如果用鼠標中鍵單擊,URL字段會獲取正常更新。這是非常令人費解的,因爲我不能「覆蓋」信號並改變這種行爲。

任何人都可以運行我的瀏覽器並檢查行爲? (由於複製它需要大量的工作)。

編輯:

urlChanged signal當YouTube視頻上用鼠標左鍵點擊也沒有通過QUrl。等待loadFinished也沒用。

回答

2

我不能直接回答你的問題,但基於這個和你以前的問題,我懷疑你讓自己的事情比你需要的更困難。 QWebView自動處理視圖中的URL導航(包括JavaScript),因此您無需直接處理鼠標事件或鏈接。

當在視圖中點擊鏈接時,下一頁將自動打開,並且QWebView將觸發urlChanged信號。如果你想保持同步的地址欄,您可以連接到這個信號,並簡單地更新地址欄文本,例如:

webview.urlChanged.connect(<custom slot function>) 

插槽函數將接受代表新頁面的URL一個QUrl,您可以將其轉換爲字符串:

def url_changed(self, q): 
    <your-urlbar-obj>.setText(q.toString()) 
+0

非常有趣,我不知道urlChanged。我已經對它進行了測試,但在Youtube上,當我訪問視頻時,URL字段永遠保留在「www.youtube.com」中。這是一個問題,因爲我試圖實現書籤(並且我需要每個視頻的鏈接與其詞典中的標題相關聯)。在某處,PyQt4存在問題。 –

+0

@EricsonWillians這很奇怪,當我在這裏做它工作正常。我已經發布了一個演示標籤式瀏覽器的源代碼,我把它放在一起作比較http://gist.github.com/mfitzp/d6fa26865e2beeb4f9e9a5701f33091a – mfitzp

+0

那麼,你使用PyQt5,我使用PyQt4,所以也許這就是問題所在。我會更新我的,並檢查它是否有效。 –