PyQt5 QWebEngineView点击链接打开新页面问题
用QWebEngineView展示web界面,点击链接后没反应,上网查到了用urlChanged信号,但是这个是同一页面跳转的时候才会改变URL,打开新页面不会改变当前页的URL,自然也没有这个信号;
打开新页面会调用QWebEngineView中的createWindow这个函数,所以可以重写这个函数达到目的,参照https://tieba.baidu.com/p/5136101813?red_tag=0301629953能够打开一个新的窗口显示新web
还有https://www.cnblogs.com/Netsharp/p/9260862.html新建了一个窗口,和上面的效果应该一样。
https://blog.csdn.net/v6543210/article/details/89969557这个使得web能够在当前窗口显示
QWebEngineView *WebView::createWindow(QWebEnginePage::WebWindowType type)
{
return this;
}
可是上面找到的例子都是C++的,没看到python的,我在python中使用return self不行,自己新建窗口显示的话,会显示空白的页面,查看到当前页面的URL是空的。我的错误代码如下:
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
from PyQt5 import QtCore
from PyQt5.QtCore import Qt
class MyWebView(QWebEngineView):
def createWindow(self, QWebEnginePage_WebWindowType):
newWeb = MyWebView(self)
newWeb.setGeometry(QtCore.QRect(0, 0, 300, 150)) # 设置大小
newWeb.show()
return
问题就是URL是空的,没传进来,找了很久,后来在https://stackoverflow.com/questions/47897467/qwebengine-open-createwindow-if-target-blank上面发现了答案,他是把newWeb设置成了MyWebView的类变量,这样才能传递点击的URL,代码如下:
def createWindow(self, QWebEnginePage_WebWindowType):
if QWebEnginePage_WebWindowType == QWebEnginePage.WebBrowserTab:
self.newWeb = MyWebView(self)
# self.newWeb = MyWebView() # 不认self为父,就会在新窗口显示,认self作父就能在当前窗口显示
self.newWeb.setAttribute(Qt.WA_DeleteOnClose, True) # 加上这个属性能防止Qt Qtwebengineprocess进程关不掉导致崩溃
self.newWeb.setGeometry(QtCore.QRect(0, 0, 300, 150))
self.newWeb.show()
return self.newWeb
return super(MyWebView, self).createWindow(QWebEnginePage_WebWindowType)