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

Python QWebEngineView-如何在系统浏览器中打开链接,python,pyside2,qwebengineview,Python,Pyside2,Qwebengineview,我有以下代码段在PySide中工作,需要将其转换为在PySide2中工作。 其目的是在单击时强制在系统浏览器中打开所有链接(而不是小部件尝试加载链接): 这是我的翻译尝试: from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage class HtmlView(QWebEngineView): def __init__(self, parent=None): super(HtmlView

我有以下代码段在PySide中工作,需要将其转换为在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
但是,.linkClicked不存在,.setLinkDelegationPolicy或 .授权所有链接

在PySide2中实现这一点的最佳方法是什么

编辑:我检查了已触发的QEvents,但单击链接时似乎没有触发任何事件,因此如果没有PySide/Qt4.8中的事件,我不知道如何连接到此事件

谢谢, 弗兰克

你必须使用:

在接收到导航到的请求时调用此函数 通过指定的导航类型指定的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的上下文中打开链接(以使相对链接和绝对链接一样有效)。我假设这是主框架vs子框架的部分?现在开始调查…@FrankRueter这是另一个问题,创建另一个帖子。如果我的回答对你有帮助,别忘了把它标记为正确。@FrankRueter在这样你就可以一个问题一个问题地创建一个帖子,当你创建帖子时,我会在另一个问题上帮助你:Psure,够公平了。刚刚测试了一切,这绝对是正确的答案,谢谢!
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_())