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

Posted

技术标签:

【中文标题】QWebEngineView - 如何在系统浏览器中打开链接【英文标题】:QWebEngineView - how to open links in system browser 【发布时间】: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 事件,我不知道如何挂钩。

谢谢, 坦率的

【问题讨论】:

【参考方案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://***.com/questions/47736408/pyside2-qwebview-how-to-open-links-in-system-browser"));
    w.show()
    sys.exit(app.exec_())

【讨论】:

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

以上是关于QWebEngineView - 如何在系统浏览器中打开链接的主要内容,如果未能解决你的问题,请参考以下文章

QWebEngineView 在外部浏览器中打开

PyQt5中的QWebEngineView和QWidget

PyQt5 中的 QWebEngineView 和 QWidget

如何在 QWebEngineView 周围显示边框?

qwebengineview读dnsconfig失败

QWebEngineView 未使用默认 Windows 海拔加载