Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在QML中创建PyQT注册类型的动态实例_Python_Qt_Pyqt5_Qml - Fatal编程技术网

Python 如何在QML中创建PyQT注册类型的动态实例

Python 如何在QML中创建PyQT注册类型的动态实例,python,qt,pyqt5,qml,Python,Qt,Pyqt5,Qml,在注册Python类型的基础上:我希望能够在QML中动态实例化已注册Python类型的实例 例如,定义人员类型: class Person(QObject): def __init__(self, parent=None): super().__init__(parent) self._name = '' @pyqtProperty('QString') def name(self): return self._name

在注册Python类型的基础上:我希望能够在QML中动态实例化已注册Python类型的实例

例如,定义人员类型:

class Person(QObject):
    def __init__(self, parent=None):
        super().__init__(parent)

        self._name = ''

    @pyqtProperty('QString')
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name

# ...
qmlRegisterType(Person, 'People', 1, 0, 'Person')
现在在QML中,我想说,单击按钮时创建一个新的Person对象,例如:

import People 1.0

import QtQuick 2.7
import QtQuick.Layouts 1.12
import QtQuick.Window 2.2
import QtQuick.Controls 2.5

// create application window etc.
// add a button
Button {
    text: "Ok"
    onClicked: {
        var p = new Person();
        p.name = 'Bob';
    }
}

这不管用。我认为Qt的createComponent函数可能是一种可行的方法,但我无法让它工作。

您试图将其实例化为一个javascript对象。但事实并非如此。您创建了一个QML对象。因此,您必须以这种方式实例化它,如下所示:

import People 1.0
import QtQuick 2.7

Person {
    name: 'Bob'
}
如果您想动态创建它,那么您也可以使用QML方法:

function createPerson() {
    var qml = "import QtQuick 2.0; import People 1.0; Person { name: 'Bob' }";
    var personObj = Qt.createQmlObject(qml, parentObj, "createPerson");
}

您试图将其实例化为一个javascript对象。但事实并非如此。您创建了一个QML对象。因此,您必须以这种方式实例化它,如下所示:

import People 1.0
import QtQuick 2.7

Person {
    name: 'Bob'
}
如果您想动态创建它,那么您也可以使用QML方法:

function createPerson() {
    var qml = "import QtQuick 2.0; import People 1.0; Person { name: 'Bob' }";
    var personObj = Qt.createQmlObject(qml, parentObj, "createPerson");
}

如果要通过以下方式创建组件来动态实例化qml对象:

function create_person(name){
    var p = Qt.createQmlObject("import People 1.0; Person{}", null, "createPerson")
    p.name = name
}


如果要通过以下方式创建组件来动态实例化qml对象:

function create_person(name){
    var p = Qt.createQmlObject("import People 1.0; Person{}", null, "createPerson")
    p.name = name
}