问题描述
我使用 pyqt5 和 PyQtWebEngine 制作了一个 Web 浏览器.它工作正常,但是当我单击带有 target=_blank"的超链接时那么它不起作用,但我将如何解决它.您可以通过点击此链接查看其源代码 https://github.com/SaptakBhoumik/WebPlus.请检查我的代码并告诉我该怎么做
I have made a web browser using pyqt5 and PyQtWebEngine.It works fine but when I click on a hyperlink with target="_blank" then it does not work but how will I fix it. You can view its source code by clicking on this link https://github.com/SaptakBhoumik/WebPlus . Please review my code and tell me what to do
推荐答案
如 文档:
_blank:通常是一个新标签页,但用户可以配置浏览器打开一个新窗口.
_blank: usually a new tab, but users can configure browsers to open a new window instead.
也就是说,目标不是重新加载页面,而是创建一个新选项卡,然后为了获得该请求,您必须重写 QWebEngineView(或 QWebEnginePage)的 createWindow 方法:
That is, the objective is not to reload the page but to create a new tab, and then to obtain that request you must override the createWindow method of QWebEngineView (or QWebEnginePage):
from functools import cached_property import sys from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets class WebView(QtWebEngineWidgets.QWebEngineView): def createWindow(self, type_): if not isinstance(self.window(), Browser): return if type_ == QtWebEngineWidgets.QWebEnginePage.WebBrowserTab: return self.window().tab_widget.create_tab() class TabWidget(QtWidgets.QTabWidget): def create_tab(self): view = WebView() index = self.addTab(view, "(Untitled)") self.setTabIcon(index, view.icon()) view.titleChanged.connect( lambda title, view=view: self.update_title(view, title) ) view.iconChanged.connect(lambda icon, view=view: self.update_icon(view, icon)) self.setCurrentWidget(view) return view def update_title(self, view, title): index = self.indexOf(view) self.setTabText(index, title) def update_icon(self, view, icon): index = self.indexOf(view) self.setTabIcon(index, icon) class Browser(QtWidgets.QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.setCentralWidget(self.tab_widget) view = self.tab_widget.create_tab() view.load( QtCore.QUrl( "https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_a_target" ) ) @cached_property def tab_widget(self): return TabWidget() def main(): app = QtWidgets.QApplication(sys.argv) w = Browser() w.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
注意:建议您查看官方示例:WebEngine Widgets 简单浏览器示例,以及在 PySide2 很容易翻译成 PyQt5 实现了这个功能和更多功能.
Note: I recommend that you review the official example: WebEngine Widgets Simple Browser Example, in addition to its implementation in PySide2 which is easily translatable to PyQt5 where this feature and many more are implemented.