Qt.createComponent () с существующим импортированным типом - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь создать компонент существующего импортированного типа.Хотя эта задача кажется достаточно важной (например, при создании компонентов типов, обнаруженных в ваших собственных установленных плагинах QML), она, похоже, не документирована.Например, при попытке создать компонент MyObject, обходной путь должен создать файл MyObjectComponent.qml в приложении следующим образом:

import MyPackage 1.0
MyObject{}

Затем компонент из этого объекта может быть создан с помощью Qt.createComponent("MyObjectComponent.qml"), но этот метод кажется излишним.Есть ли более лаконичный способ?Я бы ожидал, что Qt.createComponent("MyObject") будет работать, но это не так.

1 Ответ

0 голосов
/ 27 июня 2018

Qt.createComponent определено, чтобы принимать URL в качестве аргумента, а не имя типа, поэтому нет, нет способа использовать Qt.createComponent(Type). Но я до сих пор не понимаю, что может быть от этого.

  • Это не дает никакой гибкости, поскольку нет типа QML для передачи типов в качестве значений.
  • Это не дает никакого выигрыша в производительности, так как Qt.createComponent(URL) также использует кеш компонента двигателей.

Также есть только несколько случаев использования, когда явное создание компонента JS с Qt.createComponent - правильный путь, так как QML является декларативным языком, и большинство вещей можно сделать декларативным.

Рассмотрим следующие способы создания компонентов:

Если тип свойства Component, вы можете использовать стандартный синтаксис для создания объектов. Автоматически создание объекта прекращается после шага createComponent:

property Component someProperty: Item {
    // This Item is not instantiated. Instead only a prototpye/component is created
    // and bound to the property 'someProperty'
}

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

Component {
    id: myComponent // Use this to reference the Component later.
    Item {
        // This Item is not instantiated. Instead only a prototpye/component is created
        // You can reference it by the *Component's id*
    }
}

Это также может быть использовано при назначении свойства:

property var someProperty: Component {
    Item {
    }
}

TL; DR
Нет - вы не можете передать тип функции в QML, поэтому вы также не можете сделать это с помощью Qt.createComponent - особенно, если он указан для получения URL-адреса.
Если у вас все еще есть ощущение, что это будет необходимо, и любой из других способов создания Component не соответствует вашим потребностям, пожалуйста, спросите еще раз и укажите, что вы пытаетесь сделать, и почему вы думаете, что это будет необходимо сделать это, и мы могли бы найти способ решить вашу реальную проблему.

...