Создание пользовательских экземпляров объектов qml с помощью Qt.createQmlObject () - PullRequest
3 голосов
/ 25 ноября 2011

У меня есть собственный объект QML с именем Target.qml.Я хотел бы создать динамические экземпляры этого объекта, используя Qt.createQmlObject().

. Он работает при использовании встроенных объектов qml, таких как Image:

var newTarget = Qt.createQmlObject('import Qt 4.7; Image {source: "widgets/SlideSwitchImages/knob.png"; }', parent);

, но не работает при использовании любых пользовательских типов объектов, таких как:

var newTarget = Qt.createQmlObject('import Qt 4.7; Target {}', parent);

Если, однако, я использую свой собственный тип цели статически в QML, все работает.Это известное ограничение, какие-либо обходные пути?

Ответы [ 2 ]

4 голосов
/ 26 ноября 2011

Если вам просто нужно произвольное количество экземпляров Target, лучше использовать Component.

Component {
    id: targetFactory
    Target {}
}

var newTarget = targetFactory.createObject(parent, properties)

Однако, если вы хотите придерживаться вызова Qt.createQmlObject, я думаю, у вас есть компонент Target в другом каталоге, и вы просто пропускаете какой-то оператор импорта. Строковый параметр должен быть содержимым файла QML, который работает сам по себе в том же каталоге, что и вызывающий его.

* 1006 Е.Г. *

var newTarget = Qt.createQmlObject('import QtQuick 1.0; import "../Targets"; Target {}', parent);

Кстати: импорт Qt 4.7 устарел, потому что он не допускает дополнительные версии QtQuick.

1 голос
/ 25 ноября 2011

Из документов :

Существует два способа динамического создания объектов из JavaScript.Вы можете либо вызвать Qt.createComponent () для динамического создания объекта Component, либо использовать Qt.createQmlObject () для создания элемента из строки QML. Создание компонента лучше, если у вас есть существующий компонент, определенный в файле .qml , и вы хотите динамически создавать экземпляры этого компонента.В противном случае создание элемента из строки QML полезно , когда сам QML элемента генерируется во время выполнения.

Я понимаю, что это означает, что createQmlObject будет работать, только если вы определили тип элемента во время выполнения и, следовательно, приложение знает о его существовании.

createComponent, кажется, выполняет ту же функцию, но для типов элементов, предварительно определенных в файлах .qml , как в вашем случае.

...