在QML

2014-01-25 51 views
2

按鈕使用Qt 5.2的動態創建,我想動態添加一個簡單的按鈕,像這樣:在QML

ApplicationWindow 
{ 
    id: appWindow 

    width: 640 
    height: 420 
    minimumHeight: 400 
    minimumWidth: 600 

    function addButton() { 

     var obj = Qt.createComponent("Button.qml"); 

     if (obj.status == obj.Ready) 
     { 
      var button = obj.createObject(appWindow); 
      button.color = "red"; 
      button.width=50; 
      button.height=80; 
      button.x=50; button.y=50; 
      } 
    } 


    Button { 
     anchors.centerIn: parent; 
     text: "ok"; 

     onClicked: { 
      addButton(); 
     } 
    } ... 

但就在createComponent後,我總是得到:

QQmlComponent :組件沒有準備好

怎麼了?

+1

根據示例[here](https://qt-project.org/doc/qt-5.0/qtqml/qtqml-javascript-dynamicobjectcreation.html)。必須使用'Component.Ready'枚舉檢查'object.status'是否相等('==')。並且你也可以打印,像這樣的錯誤 'if(component.status == Component.Error){ // Error Handling console.log(「Error loading component:」,component.errorString()); }' 我希望'addButton'函數在靜態Button組件中沒有解析。因此,請嘗試在'onClicked'事件處理程序中添加'appWindow.addButton();'。 – RajaRaviVarma

+0

我已經將import語句添加到文件的開頭,並且它可以正確運行而不會出錯。我看到一個按鈕 – Kakadu

回答

2

爲了確保組件準備就緒,最好的方法是簡單地在Component對象內部的QML部分中聲明它,以便它將與文件的其餘部分同時被預加載:

ApplicationWindow { 
    id: appWindow; 

    Component { 
     id: myButton; 

     Button { } 
    } 

    function addButton() { 
     var button = myButton.createObject (appWindow, { 
               "color" : "red", 
               "width" : 50, 
               "height" : 80, 
               "x"  : 50, 
               "y"  : 50 
              }); 
    } 

    ... 
} 

正如你所看到的,我也冒昧向您展示的語法與良好性能的一次拍攝中直接創建對象,而不是在老同學的方式進行手動設置。更乾淨的代碼,可能更高性能。