Сделайте любую ссылку (даже _blank) открытой в том же окне, используя QWebEngine

У меня есть этот код, который должен посещать/следовать любой ссылке, которую я нажимаю в том же окне, даже если она обычно открывается в новом окне. Это было бы вместо того, чтобы щелкнуть правой кнопкой мыши, а затем выбрать «Перейти по ссылке» из контекстного меню. По какой-то причине это не работает, как ожидалось.

Вот код:

from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage


class WebEnginePage(QWebEnginePage):
    def acceptNavigationRequest(self, url,  _type, isMainFrame):
        if _type == QWebEnginePage.NavigationTypeLinkClicked:
            return True
        return QWebEnginePage.acceptNavigationRequest(self, url,  _type,      isMainFrame)

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://yahoo.com"));
    w.show()
    sys.exit(app.exec_())

person Maxwe11    schedule 19.12.2017    source источник


Ответы (1)


Если вы хотите, чтобы ссылки всегда открывались в одном и том же окне, вы можете повторно реализовать createWindow, чтобы он возвращал то же представление:

class HtmlView(QWebEngineView):
    def createWindow(self, wintype):
        return self

Аргумент wintype предоставляет информацию о том, какой тип окна запрашивается. Вы можете по-разному относиться к диалоговым окнам.

Обратите внимание, что подкласс WebEnginePage в вашем примере не нужен, чтобы это работало.

person ekhumoro    schedule 19.12.2017
comment
Это работает, но у меня есть webengineview в центральном виджете Qmainwindow, так что как бы я это сделал. Я пытался вернуть self.widget вместо себя, но не получилось. - person Maxwe11; 20.12.2017
comment
@Maxwe11. Ничего менять не надо - должно быть return self. Должен быть отдельный подкласс QWebEngineView, как показано в моем ответе. Создайте экземпляр HtmlView и установите его в качестве центрального виджета QMainWindow. - person ekhumoro; 20.12.2017
comment
Сделал это, но есть еще одна проблема, когда он создает окно, предыдущая история больше не доступна. есть ли другой способ сделать это? как я могу просто имитировать ссылку перехода в контекстном меню qwebengine? - person Maxwe11; 20.12.2017