【问题标题】:QWebEngineView - how to open links in system browserQWebEngineView - 如何在系统浏览器中打开链接
【发布时间】:2017-12-10 06:14:48
【问题描述】:

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

谢谢, 坦率的

【问题讨论】:

    标签: python pyside2 qwebengineview


    【解决方案1】:

    你必须使用acceptNavigationRequest:

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

    在你的情况下,当类型为QWebEnginePage::NavigationTypeLinkClicked.时,你必须拒绝并打开url

    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_())
    

    【讨论】:

    • 太棒了,我刚刚在这里的另一篇文章中偶然发现了相同的信息。我忘记了一件事:我需要在给定 url 的上下文中打开链接(以使相对链接和绝对链接一样有效)。我假设这是主框架与子框架部分?现在正在调查...
    • @FrankRueter 这是另一个问题,创建另一个帖子。如果我的回答对你有帮助,别忘了标记为正确。
    • @FrankRueter 在所以你创建一个问题的帖子,我会在你创建帖子时帮助你解决另一个问题:P
    • 当然,很公平。刚刚测试了一切,这绝对是正确的答案,谢谢!
    猜你喜欢
    • 2014-02-19
    • 2017-08-21
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 2022-01-12
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多