Как открыть гиперссылку с target =»_blank» в PyQtWebEngine?

#python #pyqt5 #qtwebengine #qwebengineview

#python #pyqt5 #qtwebengine #qwebengineview

Вопрос:

Я создал веб-браузер, используя pyqt5 и PyQtWebEngine.Это работает нормально, но когда я нажимаю на гиперссылку с target =»_blank», она не работает, но как я это исправлю. Вы можете просмотреть его исходный код, нажав на эту ссылку https://github.com/SaptakBhoumik/WebPlus . Пожалуйста, просмотрите мой код и скажите мне, что делать

Ответ №1:

Как указано в документах:

_blank: обычно это новая вкладка, но пользователи могут настроить браузеры на открытие нового окна.

То есть целью является не перезагрузка страницы, а создание новой вкладки, а затем для получения этого запроса вы должны переопределить метод CreateWindow QWebEngineView (или 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, где реализована эта функция и многие другие.

Комментарии:

1. Не могли бы вы просмотреть мой код и сказать мне, что делать. Вы можете просмотреть его исходный код, нажав на эту ссылку github.com/SaptakBhoumik/WebPlus

2. @SaptakBhoumik Нет, я не занимаюсь реализацией своих решений в проектах (по крайней мере, не в SO), поэтому моего ответа достаточно, поскольку он охватывает всю логику, позволяющую его реализовать