【问题标题】:How to open hyperlink with target="_blank" in PyQtWebEngine?如何在 PyQtWebEngine 中使用 target="_blank" 打开超链接?
【发布时间】:2021-05-29 16:02:58
【问题描述】:

我已经使用 pyqt5 和 PyQtWebEngine 制作了一个 Web 浏览器。它工作正常,但是当我单击带有 target="_blank" 的超链接时,它不起作用,但我将如何解决它。您可以点击此链接https://github.com/SaptakBhoumik/WebPlus查看其源代码 .请检查我的代码并告诉我该怎么做

【问题讨论】:

    标签: python pyqt5 qtwebengine qwebengineview


    【解决方案1】:

    the docs中所述:

    _blank:通常是一个新标签页,但用户可以配置浏览器打开一个新窗口。

    也就是说,目标不是重新加载页面,而是创建一个新选项卡,然后要获得该请求,您必须重写 QWebEngineView(或 QWebEnginePage)的 createWindow 方法:

    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 Simple Browser Example,除了它在 PySide2 中的实现,它很容易转换为 PyQt5,其中实现了此功能和更多功能。

    【讨论】:

    • 您能否查看我的代码并告诉我该怎么做。您可以点击此链接查看其源代码github.com/SaptakBhoumik/WebPlus
    • @SaptakBhoumik 不,我并不致力于在项目中实施我的解决方案(至少不是在 SO 中)所以我的回答就足够了,因为它涵盖了能够实施它的所有逻辑
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多