2017-08-24 14 views
1

是否有一種實例化內聯Component(即在同一文件中定義)而不使用Loader的方法?我不太關心使用Loader的性能影響,因爲我正在用大量的Loader包裝來污染我的文件。實例化沒有加載程序的內聯組件

回答

2

您可以使用Repeater創建沒有Loader的組件。 或者你甚至可以使用Qt.createComponent來做到這一點。

看看Qt文檔約Dynamic Component Creation in QML

信息和示例有關Repeater可以發現here

您甚至可以從字符串動態創建的組件:

Rectangle { 
    id: appWindow 
    width: 300; height: 300 

    Component.onCompleted: { 
     var newObject = Qt.createQmlObject('import QtQuick 2.0; Rectangle {color: "red"; width: 20; height: 20}', 
             appWindow, 
             "dynamicSnippet1"); 
    } 
} 
4

我發現, Dynamic QML Object Creation from JavaScript頁面可能會引起誤解。

沒有提到使用聲明創建的Component或使用模型。它只提到了Qt.createComponentQt.createQmlObject,它們在大多數情況下都是不必要的(並且依賴於字符串)。

我會建議使用內聯ComponentcreateObject(),而不是更可讀和可維護的代碼。像這樣:

Rectangle { 
    id: appWindow 
    width: 300; height: 300 

    Component { 
     id: redRectComponent 
     Rectangle { 
      color: "red" 
      width: 20 
      height: 20 
     } 
    } 

    Component.onCompleted: { 
     var newObject = redRectComponent.createObject(appWindow); 
    } 
} 

如果我想勢在必行創建一個臨時對象,例如像一個彈出我會使用這種方法。

如果我要創建幾個這些對象的,我很可能會使用一個ListModelListView/Repeater/Instantiator/......像這樣:

ListModel { 
    id: rectModel 
} 

Column { 
    Repeater { 
     model: rectModel 
     Rectangle { 
      color: model.rectColor 
      width: 20 
      height: 20 
     } 
    } 
} 

Button { 
    onClicked: rectModel.append({rectColor: "red"}) 
} 

我在這裏甚至沒有爲了處理對象創建,我只需在ListModel中插入一些數據,Repeater負責處理代表的實例化。

相關問題