为什么" linkClicked(const QUrl&)"信号没有捕获鼠标左键的QUrl?

时间:2016-05-21 18:05:28

标签: python pyqt

首先,我想明确表示这种奇怪的行为不适用于每个网站。

这是我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也没用。

1 个答案:

答案 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())