尝试在Qt中分配无父窗口小部件时的奇怪行为

时间:2016-11-06 17:25:06

标签: python pyqt parent-child pyqt5 qwebengineview

我有以下代码:

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-class的新实例,将视图设置为其父级并将其指定为视图页面。它按预期工作。

接下来我也这样做,但没有给父母。相反,我创建了一个临时变量,它包含一个新Q并分配它。它仍然按预期工作。

最后,我直接指定一个动态创建的无父Q.由于某些原因,这不起作用,页面重置为默认类。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

QWebEngineView不取得QWebEnginePage的所有权,也不会重新拥有它。

对于第三个示例,页面没有父级,但它保持活动状态,因为python拥有对它的全局引用。

对于最后一个示例,没有父项,也没有外部引用,因此页面在设置之前会被垃圾收集。它实际上等同于调用setPage(None),它将删除先前设置的页面并恢复默认值。