Python 如何在QML中创建PyQT注册类型的动态实例
在注册Python类型的基础上:我希望能够在QML中动态实例化已注册Python类型的实例 例如,定义人员类型: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
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
}
或