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 - 如何在系统浏览器中打开链接的主要内容,如果未能解决你的问题,请参考以下文章