1

我有以下代码片段在 PySide 中工作,需要将其翻译为在 PySide2 中工作。目的是在单击时强制所有链接在系统浏览器中打开(而不是小部件试图加载它们):

from PySide.QtWebKit import QWebView, QWebPage

class HtmlView(QWebView):

    def __init__(self, parent=None):
        super(HtmlView, self).__init__(parent)
        self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) # not working in PySide2
        self.linkClicked.connect(self.openWebsite) # not working in PySide2

这是我的翻译尝试:

from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage

class HtmlView(QWebEngineView):

    def __init__(self, parent=None):
        super(HtmlView, self).__init__(parent)
        self.page().setLinkDelegationPolicy(QWebEnginePage.DelegateAllLinks) # not working in PySide2
        self.linkClicked.connect(self.openWebsite) # not working in PySide2

但是,QWebEngineView .linkClicked 不存在,QWebEngineView .setLinkDelegationPolicy 或 QWebEnginePage .DelegateAllLinks 也不存在。

没有上述内容,在 PySide2 中实现这一目标的最佳方法是什么?

编辑:我检查了触发的 QEvents,但单击链接时似乎没有触发任何事件,因此如果没有来自 PySide/Qt4.8 的linkClicked事件,我不知道如何挂钩。

谢谢,坦率

4

1 回答 1

1

您必须使用acceptNavigationRequest

在接收到通过指定导航类型类型导航到指定 url 的请求时调用此函数。isMainFrame 指示请求是对应于主框架还是子框架。如果函数返回 true,则接受导航请求并加载 url。默认实现接受所有导航请求。

在您的情况下,您必须在类型为时拒绝并打开 urlQWebEnginePage::NavigationTypeLinkClicked.

from PySide2.QtCore import QUrl
from PySide2.QtGui import QDesktopServices
from PySide2.QtWidgets import QApplication
from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage


class WebEnginePage(QWebEnginePage):
    def acceptNavigationRequest(self, url,  _type, isMainFrame):
        if _type == QWebEnginePage.NavigationTypeLinkClicked:
            QDesktopServices.openUrl(url);
            return False
        return True

class HtmlView(QWebEngineView):
    def __init__(self, *args, **kwargs):
        QWebEngineView.__init__(self, *args, **kwargs)
        self.setPage(WebEnginePage(self))

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    w = HtmlView()
    w.load(QUrl("https://stackoverflow.com/questions/47736408/pyside2-qwebview-how-to-open-links-in-system-browser"));
    w.show()
    sys.exit(app.exec_())
于 2017-12-10T06:44:20.170 回答