尝试在 Qt 中分配无父小部件时的奇怪行为
Odd behavior when trying to assign parentless widget in Qt
我有以下代码:
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-derived Q-class 的新实例,将视图设置为其 parent 并将其指定为视图的页面。它按预期工作。
接下来我也这样做,但没有给出 parent。相反,我创建了一个临时变量来保存一个新的 Q 并赋值给它。它仍然按预期工作。
最后,我直接分配了一个动态创建的parentless Q。由于某些原因这不起作用并且页面重置为默认class。
为什么会这样?
QWebEngineView
没有取得 QWebEnginePage
的所有权,也没有重新设置它的父级。
对于第三个示例,该页面没有父页面,但它保持活动状态,因为 python 持有对它的全局引用。
对于最后一个示例,没有父级也没有外部引用,因此页面在设置之前被垃圾回收。它实际上等同于调用setPage(None)
,它将删除之前设置的页面并恢复默认。
我有以下代码:
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-derived Q-class 的新实例,将视图设置为其 parent 并将其指定为视图的页面。它按预期工作。
接下来我也这样做,但没有给出 parent。相反,我创建了一个临时变量来保存一个新的 Q 并赋值给它。它仍然按预期工作。
最后,我直接分配了一个动态创建的parentless Q。由于某些原因这不起作用并且页面重置为默认class。
为什么会这样?
QWebEngineView
没有取得 QWebEnginePage
的所有权,也没有重新设置它的父级。
对于第三个示例,该页面没有父页面,但它保持活动状态,因为 python 持有对它的全局引用。
对于最后一个示例,没有父级也没有外部引用,因此页面在设置之前被垃圾回收。它实际上等同于调用setPage(None)
,它将删除之前设置的页面并恢复默认。