Why the “linkClicked(const QUrl&)” signal does not capture a QUrl for the left mouse button?
首先,我想澄清一下,这种奇怪的行为并不适用于每个网站。
以下是我的网页浏览器中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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,即:
1 2 3 4 | 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上运行得不好(例如)。从文档中可以看到,如果涉及到javascript,则可能不会发出信号。这是"好的",但有一个问题:
当我用鼠标中键单击链接时,信号确实会发出(这没有意义!).
因此,如果我使用第一个鼠标按钮访问YouTube上的视频,则URL字段不会更新,因为没有任何URL传递给更新链接方法,但如果我使用鼠标中键单击,则URL字段会正常更新。这非常令人费解,因为我不能"覆盖"一个信号并改变这个行为。
有人能运行我的浏览器并检查行为吗?(因为复制它需要大量的工作)。
编辑:
当用鼠标左键点击youtube视频时,urlchanged信号也不会传递qurl。等待加载完成也是无用的。
我不能直接回答你的问题,但基于这个和你以前的问题,我怀疑你让事情变得比你需要的更困难。
当在视图中单击链接时,下一页将自动打开,并且
1 | webview.urlChanged.connect(<custom slot function>) |
slot函数将接收一个表示新页面的URL的
1 2 | def url_changed(self, q): <your-urlbar-obj>.setText(q.toString()) |