QWebEngineView - 如何在系统浏览器中打开链接

时间:2017-12-10 06:14:49

标签: python pyside2 qwebengineview

我有以下代码片段在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事件我不知道如何挂钩

谢谢, 坦率

1 个答案:

答案 0 :(得分:1)

您必须使用acceptNavigationRequest

  

在收到导航到的请求时调用此函数   指定的URL通过指定的导航类型类型。   isMainFrame指示请求是否对应于main   框架或儿童框架。如果函数返回true,则导航   请求被接受并且网址已加载。默认实现   接受所有导航请求。

在您的情况下,您必须在类型为QWebEnginePage::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_())