首先,我想說清楚,這種奇怪的行爲並不適用於每個網站。爲什麼「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也沒用。
非常有趣,我不知道urlChanged。我已經對它進行了測試,但在Youtube上,當我訪問視頻時,URL字段永遠保留在「www.youtube.com」中。這是一個問題,因爲我試圖實現書籤(並且我需要每個視頻的鏈接與其詞典中的標題相關聯)。在某處,PyQt4存在問題。 –
@EricsonWillians這很奇怪,當我在這裏做它工作正常。我已經發布了一個演示標籤式瀏覽器的源代碼,我把它放在一起作比較http://gist.github.com/mfitzp/d6fa26865e2beeb4f9e9a5701f33091a – mfitzp
那麼,你使用PyQt5,我使用PyQt4,所以也許這就是問題所在。我會更新我的,並檢查它是否有效。 –