我有以下代码:

from PyQt5 import QtWebEngineWidgets, QtWidgets


class Q(QtWebEngineWidgets.QWebEnginePage):
    pass


app = QtWidgets.QApplication([])

l = QtWebEngineWidgets.QWebEngineView()
print(type(l.page()))

l.setPage(Q(l))
print(type(l.page()))

p = Q()
l.setPage(p)
print(type(l.page()))

l.setPage(Q())
print(type(l.page()))

app.exec_()

结果如下:
<class 'PyQt5.QtWebEngineWidgets.QWebEnginePage'>
<class '__main__.Q'>
<class '__main__.Q'>
<class 'PyQt5.QtWebEngineWidgets.QWebEnginePage'>

首先,我创建一个QWebEnginePage派生Q类的新实例,将视图设置为其父视图,并将其分配为视图的页面。它按预期工作。
接下来我也会这样做,但不给父母。相反,我创建了一个临时变量来保存一个新的Q并将其赋值。它仍然按预期工作。
最后,我直接分配一个动态创建的无父Q。由于某些原因,这不起作用,页面重置为默认类。
为什么会这样?

最佳答案

QWebEngineView不拥有QWebEnginePage的所有权,也不重新成为其父级。
对于第三个示例,页面没有父级,但它保持活动状态,因为python持有对它的全局引用。
对于上一个示例,没有父引用和外部引用,因此在设置页面之前,该页面会被垃圾回收。它实际上相当于调用setPage(None),这将删除先前设置的页面并恢复默认值。

09-28 12:06