我需要使用 pyQt5 打开一个 URL。该页面有几个打开新窗口的链接。 pyQt5 为该 URL 打开一个窗口,但在单击应该打开一个新窗口的链接后不执行任何操作。 P.S 我正在使用 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' 时打开一个新窗口。
最佳答案
您必须覆盖 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_())
关于python - 单击外部 url 链接时窗口不会打开新窗口或选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55472415/