首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用QDesktopServices.openUrl()打开QWebEnginePage::createWindow()创建的窗口

使用QDesktopServices.openUrl()打开QWebEnginePage::createWindow()创建的窗口
EN

Stack Overflow用户
提问于 2021-03-22 08:27:42
回答 1查看 218关注 0票数 0

当JavaScript程序请求在新窗口中打开文档时,QWebEnginePage::createWindow()将被调用以创建一个新窗口,而我希望(1)使用QDesktopServices.openUrl(url)打开新窗口,而(2)则保持QWebEngineView中的视图不变。我的解不能满足(2),那么还有更简单的解吗?

代码语言:javascript
复制
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWebEngineCore import *
import sys,os


class WebEnginePage(QWebEnginePage): 
  def __init__(self, parent, mdicts=[]):
    super().__init__(parent)
    self.backwardUrl=''

  def acceptNavigationRequest(self, url, navigationType, isMainFrame):  # Navigation requests can be delegated to the Qt application instead of having the HTML handler engine process them by overloading this function. This is necessary when an HTML document is used as part of the user interface, and not to display external data, for example, when displaying a list of results.# The QWebEngineUrlRequestInterceptor class offers further options for intercepting and manipulating requests.
    # print('acceptNavigationRequest-----------------', navigationType, isMainFrame)
    if self.backwardUrl and isMainFrame:
      print('blocked------------',self.backwardUrl)
      self.setUrl(self.backwardUrl)
      QDesktopServices.openUrl(self.backwardUrl)
      self.backwardUrl=''   
      return False 
    return True

  def createWindow(self, windowType):
    print('createWindow')
    self.backwardUrl=self.url()
    return self
    
class WebEngineView(QWebEngineView):
    def __init__(self, parent=None):
        super().__init__(parent)
        # self.mousePressEvent=lambda event:print('mousePressEvent',event.pos())
        # self.mouseMoveEvent=lambda event:print('mouseMoveEvent',event.pos())

        self.webPage = WebEnginePage(self)#self.page()  # QWebEnginePage()

        self.setPage(self.webPage)
        # self.setUrl(QUrl('https://dict.eudic.net/liju/en/good#TingLiju'))

        self.webPage.setUrl(QUrl('https://dict.eudic.net/liju/en/good#TingLiju'))




if __name__ == "__main__":
    app = QApplication(sys.argv)
    webEngineView = WebEngineView()
    webEngineView.show()
    sys.exit(app.exec_())

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-22 08:42:15

一个可能的解决方案是创建一个仅用于获取url的页面,当您获得它时,删除它并使用QDesktopServices::openUrl()启动url。

代码语言:javascript
复制
class FakePage(QWebEnginePage):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.urlChanged.connect(self.handle_url_changed)

    @pyqtSlot(QUrl)
    def handle_url_changed(self, url):
        QDesktopServices.openUrl(url)
        self.deleteLater()


class WebEnginePage(QWebEnginePage):
    def createWindow(self, windowType):
        return FakePage(self)


class WebEngineView(QWebEngineView):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.webPage = WebEnginePage(self)
        self.setPage(self.webPage)
        self.webPage.setUrl(QUrl("https://dict.eudic.net/liju/en/good#TingLiju"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66742525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档