2014-11-07 1 views
1

Как я понимаю, QML Component похож на класс класса C++. Он содержит определение объекта QML, но не является его экземпляром. Вы можете создать в этих отношениях Component:Статически загружайте компонент QML без его создания

  1. Создание .qml файла с именем компонента в качестве его имени.
  2. Определите его встроенный синтаксис Component { }.

Однако это фактически две разные вещи. Второй один больше похож на завод, потому что вы можете делать такие вещи, как:

Component { 
    id: factory 
    Rectangle { width: 100; height:100; color: "red } 
} 

Component.onCompleted: { 
    var rect1 = factory.createObject(parent); 
} 

В то время как с отдельным файлом необходимо сначала загрузить его на завод, как это:

var factory = Qt.createComponent("RedRectangle.qml") 
    var rect1 = factory.createObject(parent); 

Я только занимается созданием динамического объекта, так что это не вариант:

RedRectangle { 
    id: rect1 
} 

Мой вопрос: есть ли способ для создания объектов динамически, без необходимости создания компонентов завода динамически и без указания встроенного компонента. То есть Я хочу первый пример, но где Rectangle указан в другом файле.

Я хочу это:

Component { 
    id: factory 
    url: "RedRectangle.qml" 
} 
Component.onCompleted: { 
    var rect1 = factory.createObject(parent); 
} 

К сожалению, не работает. Я также пробовал:

Component { 
    id: factory 
} 
Component.onCompleted: factory.loadUrl("RedRectangle.qml"); 

Но это тоже не сработает. Неужели я глуп, или это просто не поддерживается?

ответ

0

На самом деле ответ неплохой, хотя я все еще думаю, что Component должен поддерживать указание URL напрямую.

Вот мое решение:

property var factory: Qt.createComponent("RedRectangle.qml") 
+1

Если бы у меня был никель на каждый раз, когда я чувствовал, что Qt должен поддерживать определенную функцию или существующая функция должна работать по-другому, я бы стал миллионером. Просто потому, что это большая структура, это не значит, что она полна, ведь во многих отношениях это далеко не так. Просто будьте рады, что решение так просто. Я потерял счет того, сколько раз мне приходилось изобретать колеса с Qt. – dtech

1

Вот некоторые инкапсуляция:

Fact.qml (по какой-то причине она не позволяет мне назвать его завод)

QtObject { 
    property string url 
    readonly property Component component : Qt.createComponent(url) 
    function get() { return component } 
    function load(url) { return Qt.createComponent(url) } 
} 

использования :

Fact { 
    id: f 
    url: "RedRect.qml" 
} 

StackView { 
    id: stack 
} 

Component.onCompleted: { 
    stack.push(f.component) // redrect 
    f.url = "BlueRect.qml" 
    stack.push(f.get()) // bluerect, redundant but shorter 
    stack.push(f.load("GreenRect.qml")) // greenrect, f.component is still bluerect 
} 

Он загружает компонент только тогда, когда ссылается его свойство component, и вы можете изменить URL-адрес для загрузки других компонентов с тем же экземпляром Fact. Также вспомогательный метод load(), который возвращает компонент без фактического изменения одного потенциально кэшированного.

 Смежные вопросы

  • Нет связанных вопросов^_^