关于Python的:为什么“linkClicked(const QUrl&)”信号没有捕获鼠标左键的QUrl?

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。等待加载完成也是无用的。


我不能直接回答你的问题,但基于这个和你以前的问题,我怀疑你让事情变得比你需要的更困难。QWebView自动处理视图中的URL导航(包括使用javascript),因此您不需要直接处理鼠标事件或链接。

当在视图中单击链接时,下一页将自动打开,并且QWebView将触发urlChanged信号。如果要保持URL栏同步,可以连接到此信号并简单地更新URL栏文本,例如:

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

slot函数将接收一个表示新页面的URL的QUrl,您可以将其转换为字符串:

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