单击外部 URL 链接时窗口无法打开新窗口或选项卡

raj*_*oor 3 python pyqt python-3.x pyqt5 qwebengineview

我需要使用 pyQt5 打开一个 URL。该页面有几个打开新窗口的链接。pyQt5 为 URL 打开一个窗口,但在单击应打开新窗口的链接后不执行任何操作。PS我使用的是pyQt5.6

我在 Linux centOs 上尝试过,但没有任何效果。

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://gmail.com"));
    w.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

我希望它在任何网页上单击 target='_blank' 时都会打开一个新窗口。

eyl*_*esc 5

您必须重写 createWindow 方法并返回 QWebEngineView,但为了使该对象不被破坏,它必须是另一个窗口的子级,或者是具有较长生命周期的容器的一部分。

from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets

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

class HtmlView(QtWebEngineWidgets.QWebEngineView):
    def __init__(self, windows, *args, **kwargs):
        super(HtmlView, self).__init__(*args, **kwargs)
        self.setPage(WebEnginePage(self))
        self._windows = windows
        self._windows.append(self)

    def createWindow(self, _type):
        if QtWebEngineWidgets.QWebEnginePage.WebBrowserTab:
            v = HtmlView(self._windows)
            v.resize(640, 480)
            v.show()
            return v

if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    windows = []
    w = HtmlView(windows)
    w.load(QtCore.QUrl("https://gmail.com"));
    w.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)