我有以下代码片段在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事件我不知道如何挂钩
谢谢, 坦率
答案 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_())