【问题标题】:What's happening while PySide2 load and create component?PySide2 加载和创建组件时发生了什么?
【发布时间】:2018-12-26 13:16:57
【问题描述】:

这个例子正在运行:

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_()

item 是 QQuickItem 的一个类。 component.create() 是 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

怎么了?

main.qml:

import QtQuick 2.0

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

block.qml:

import QtQuick 2.0

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

【问题讨论】:

    标签: python python-3.x qml pyside2


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 2010-09-13
      • 2011-02-14
      • 2016-09-17
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多