首先,我想明确表示这种奇怪的行为不适用于每个网站。
这是我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字段会更新一般。这非常令人费解,因为我无法覆盖"一个信号并改变这种行为。
有人可以运行我的浏览器并检查行为吗? (因为复制它需要大量的工作)。
编辑:
在youtube视频上点击鼠标左键时urlChanged signal也没有通过QUrl。等待loadFinished也没用。
答案 0 :(得分:2)
我无法直接回答您的问题,但基于此问题以及您之前的问题,我怀疑您为自己制造的事情比您需要的更难。 QWebView
自动处理视图中的URL导航(包括JavaScript),因此您无需直接处理鼠标事件或链接。
在视图中点击链接后,下一页将自动打开,QWebView
将触发urlChanged
信号。如果要保持URL栏同步,可以连接到此信号并只更新URL栏文本,例如:
webview.urlChanged.connect(<custom slot function>)
插槽功能将收到一个QUrl
,表示新页面的URL,您可以将其转换为字符串:
def url_changed(self, q):
<your-urlbar-obj>.setText(q.toString())