【问题标题】:Window does not open new window or tab on external url link click窗口未在外部 url 链接上打开新窗口或选项卡单击
【发布时间】:2019-08-23 15:22:04
【问题描述】:

我需要使用 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_())

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

【问题讨论】:

    标签: python python-3.x pyqt pyqt5 qwebengineview


    【解决方案1】:

    您必须重写 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_())
    

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2013-03-11
      • 2010-09-12
      • 1970-01-01
      • 2012-01-10
      • 2013-03-22
      • 2018-01-30
      相关资源
      最近更新 更多