PySide2加载并创建组件时发生了什么?

2024-04-26 04:39:10 发布

您现在位置:Python中文网/ 问答频道 /正文

这个例子是有效的:

from PySide2.QtCore import QUrl
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlComponent
from PySide2.QtQuick import QQuickView

app = QGuiApplication()
view = QQuickView()
engine = view.engine()
url = QUrl("main.qml")
view.setSource(url)
component = QQmlComponent(engine, QUrl.fromLocalFile("block.qml"))
item = component.create()
item.setParent(view.rootObject())
item.setParentItem(view.rootObject())
view.show()
app.exec_()

该项是QQuickItem的一个类。 这个组件.创建()是QQuickItem的一个类。 将此示例更改为:

from PySide2.QtCore import QUrl
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlComponent
from PySide2.QtQuick import QQuickView

app = QGuiApplication()
view = QQuickView()
engine = view.engine()
url = QUrl("main.qml")
view.setSource(url)
item = QQmlComponent(engine, QUrl.fromLocalFile("block.qml")).create()
item.setParent(view.rootObject())
item.setParentItem(view.rootObject())
view.show()
app.exec_()

它引发了一个异常:

Traceback (most recent call last):
File "/home/babywolf/dev/apps/qttest/test.py", line 14, in <module>     
item.setParent(view.rootObject())
RuntimeError: Internal C++ object (PySide2.QtQuick.QQuickItem) already deleted.
Process finished with exit code 1

怎么了?你知道吗

你知道吗主.qml地址:

import QtQuick 2.0

Rectangle {
    width: 200
    height: 200
    color: "green"
}

你知道吗块.qml地址:

import QtQuick 2.0

Text {
    text: "Hello World"
    anchors.centerIn: parent
}

Tags: fromimportviewappurlitemqmlengine
1条回答
网友
1楼 · 发布于 2024-04-26 04:39:10

这是PySide的一种特殊行为,如果变量没有分配给对象,它就会被消除,因此在这种情况下,QQmlComponent被创建,但没有分配给变量,因此它将被删除,这与第一种情况不同,因为它被分配给变量component,所以当想要创建项时,组件不再存在那个错误。你知道吗

一种解决方案是传递父级,因为在这种情况下可以通过视图来延长其生命周期:

item = QQmlComponent(engine, QUrl.fromLocalFile("block.qml"), view).create()
#                                                               └  - parent

相关问题 更多 >